去掉小数点后的数字

去掉小数点后的数字

我有一个包含这些字段的输入文件:

ENST00000456328.2   1657    1350.015    0   0

我正在尝试 awk 删除小数点后的数字并按原样打印其余部分

awk -F[.] '{print $1"\t"$2"\t"$3}{next;}'

但它不起作用,因为它给出了这样的输出:

ENST00000456328 2   1657    1350    015 0   0

有人可以帮忙吗。

问候。

答案1

假设输入是制表符分隔的并且您希望保持这种方式,您可以使用以下命令从 Ensembl 稳定 ID 中删除版本号

$ awk 'BEGIN { OFS=FS="\t" } { sub("\\..*", "", $1); print }' file
ENST00000456328 1657    1350.015        0       0

这会将替换应用于第一个制表符分隔字段(仅),从而删除第一个点之后的所有内容。

类似地,还有sed

$ sed 's/\.[^[:blank:]]*//' file
ENST00000456328 1657    1350.015        0       0

这将删除每行第一个点之后的所有非空白字符。您还可以使用\.[[:digit:]]*as 模式,它将显式匹配数字而不是非空格。

如果您的数据中有非版本化的 Ensembl ID 或来自其他数据库的 ID,那么您可能需要在修改该行之前确保与版本化的 Ensembl ID 匹配。对于awk,这可以通过以下方式完成

$ awk 'BEGIN { OFS=FS="\t" } /^ENS[^[:blank:]]*\./ { sub("\\..*", "", $1) } { print }' file
ENST00000456328 1657    1350.015        0       0

现在,它print位于与修改第一个字段的块不同的块中。这样,所有行(无论是否修改)都会被打印。如果您的打字时间或空间不足,则可以将整个{ print }块替换为较短的。1

sed

$ sed '/^ENS[^[:blank:]]*\./s/\.[^[:blank:]]*//' file
ENST00000456328 1657    1350.015        0       0

代码sed已经打印了所有行,无论是否修改,因此不需要进行其他修改(而在代码中awk,与第一个变体相比,结果的输出必须稍微合理awk)。

^ENS[^[:blank:]]*\.在最后两个变体中,我们在尝试进行任何修改之前,将行开头的版本化 Ensembl ID 与正则表达式进行匹配。

上述变体都不关心或不需要关心线路上的其余数据。每行可能包含其他字段,这些字段将不加修改地传递。


使用点作为字段分隔符受到启发,但会导致问题,因为行上的更多数据包含点。

答案2

如果您想删除所有小数,无论字段如何,并且能够处理不同字段中小数的可能性,您可以使用 gsub 函数:

awk '{gsub(/\.[0-9]+ /, " ")}1'

这将找到任何小数后跟 1 到无限数字和空格,然后用空格替换它们。

答案3

使用(以前称为 Perl_6)

~$ raku -ne '.words andthen put join "\t", .[0].subst(/\.\d+/), .[1..*];'  file  

Raku 是 Perl 家族的一种编程语言。虽然它的生态系统仍然很小,但它的文本处理功能(如 Perl)使其成为生物信息学的不错选择。

上面,在命令行中使用-ne非自动打印逐行标志(即awk类似行为)调用 Raku。行被分成以空格分隔的words,第一个单词 ( .[0]) 用于subst识别和删除尾随的点号。 [使用subst不带替换的命令 Raku 删除已识别的模式]。然后修改后的第一个单词以及.[1..*](该行的其余部分)join在 tabs 和 out 上编辑put

输入示例:

ENST00000456328.2   1657    1350.015    0   0
ENST00000456329 1657    1350.015    0   0

示例输出:

ENST00000456328 1657    1350.015    0   0
ENST00000456329 1657    1350.015    0   0

请注意,上面仅修改了第一列。

https://raku.org

相关内容