使用 shell 替换文件的偶数行和第二列中的字符串

使用 shell 替换文件的偶数行和第二列中的字符串

我有一个手动创建的 gff 文件。每行都是重复的,我需要将每个偶数行的第二列中的字符串“gene”替换为字符串“cds”。

我的文件如下所示:

NC_002929.2 Seq gene    3653563 3653611 .   +   .   Pred285
NC_002929.2 Seq gene    3653563 3653611 .   +   .   Pred285
NC_002929.2 Seq gene    2902987 2903162 .   -   .   rgtA
NC_002929.2 Seq gene    2902987 2903162 .   -   .   rgtA

我希望它看起来像这样:

NC_002929.2 Seq gene    3653563 3653611 .   +   .   Pred285
NC_002929.2 Seq cds     3653563 3653611 .   +   .   Pred285
NC_002929.2 Seq gene    2902987 2903162 .   -   .   rgtA
NC_002929.2 Seq cds     2902987 2903162 .   -   .   rgtA

实际文件比这个大得多,这只是一个小例子。有谁能够帮助我?

答案1

假设你有 GNU sedn 跳过 m地址运算符,并且该字符串gene不能出现在第二列之前的任何位置:

sed '2~2s/gene/cds/' file.gff

请注意 sed 没有“列”的内在概念 -2~2这里指的是每两个线从2号开始线,并且替换匹配gene行中第一次出现的 。


要将替换应用于最后一个“列”,您需要执行一些操作,例如匹配锚定到行末尾的非空白字符,例如。

sed -r '2~2{s/gene/cds/; s/[^[:blank:]]+$/ID=&/;}' file.gff

如果您想要真正面向列的东西,请尝试 awk、perl 或 miller。

答案2

也尝试一下这种awk方法:

awk  -F"[ ]" '!(NR%2) {sub (/gene/, "cdc ", $3); $NF = "ID=" $NF}  1' file
NC_002929.2 Seq gene    3653563 3653611 .   +   .   Pred285
NC_002929.2 Seq cdc     3653563 3653611 .   +   .   ID=Pred285
NC_002929.2 Seq gene    2902987 2903162 .   -   .   rgtA
NC_002929.2 Seq cdc     2902987 2903162 .   -   .   ID=rgtA

相关内容