我有一个手动创建的 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