use*_*234 1 awk text-processing bioinformatics
我有一个包含这些字段的输入文件:
ENST00000456328.2 1657 1350.015 0 0
Run Code Online (Sandbox Code Playgroud)
我正在尝试 awk 删除小数点后的数字并按原样打印其余部分
awk -F[.] '{print $1"\t"$2"\t"$3}{next;}'
Run Code Online (Sandbox Code Playgroud)
但它不起作用,因为它给出了这样的输出:
ENST00000456328 2 1657 1350 015 0 0
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗。
问候。
假设输入是制表符分隔的,并且您希望保持这种状态,您可以使用以下命令从 Ensembl 稳定 ID 中删除版本号
$ awk 'BEGIN { OFS=FS="\t" } { sub("\\..*", "", $1); print }' file
ENST00000456328 1657 1350.015 0 0
Run Code Online (Sandbox Code Playgroud)
这将替换第一个制表符分隔的字段(仅),删除第一个点之后的所有内容。
类似的sed:
$ sed 's/\.[^[:blank:]]*//' file
ENST00000456328 1657 1350.015 0 0
Run Code Online (Sandbox Code Playgroud)
这将删除每行第一个点之后的所有非空白字符。您还可以使用\.[[:digit:]]*作为模式,它会明确匹配数字而不是非空白。
如果您的数据中有非版本化的 Ensembl ID 或来自另一个数据库的 ID,那么您可能需要确保在修改该行之前匹配版本化的 Ensembl ID。有了awk,这可能与完成
$ awk 'BEGIN { OFS=FS="\t" } /^ENS[^[:blank:]]*\./ { sub("\\..*", "", $1) } { print }' file
ENST00000456328 1657 1350.015 0 0
Run Code Online (Sandbox Code Playgroud)
在print现在是在从一个根本的修改到第一场中的块的单独块。这是为了打印所有行(无论是否修改)的行。如果您的打字时间或空间不足,{ print }可以将整个块替换为较短的1。
并与sed:
$ sed '/^ENS[^[:blank:]]*\./s/\.[^[:blank:]]*//' file
ENST00000456328 1657 1350.015 0 0
Run Code Online (Sandbox Code Playgroud)
的sed代码已经打印的所有行,是否修改或没有,所以没有其它修改必须被制成(而在awk代码,结果的输出必须被稍微对齐,且在所述第一比较awk变化)。
在最后两个变体中,^ENS[^[:blank:]]*\.在尝试进行任何修改之前,我们将行首的版本化 Ensembl ID 与正则表达式进行匹配。
上述变化都不关心或不需要关心线上的其余数据。每行可能包含其他字段,这些字段将不加修改地传递。
使用点作为字段分隔符是受启发的,但会导致问题,因为行上的更多数据包含点。