我有一个带有制表符分隔符的文件:
Chr1 mak gene 120221 120946 . + . ID=spa-h0003.02;Name=spa-h0003.02
Chr1 mak mRNA 120221 120946 . + . ID=spa-cap_Chr1_00M;Parent=spa-h0003.02;Name=spa-cap_Chr1_00M
Chr1 mak exon 120221 120946 . + . Parent=spa-cap_Chr1_00M
Chr1 mak gene 18546165 18546939 . + . ID=spa-h0004.02;Name=spa-h0004.02
Chr1 mak mRNA 18546165 18546939 . + . ID=spa-cap_Chr1_18;Parent=spa-h0004.02;Name=spa-cap_Chr1_18
Chr1 mak exon 18546165 18546504 . + . Parent=spa-cap_Chr1_18
Chr1 mak exon 18546791 18546939 . + . Parent=spa-cap_Chr1_18
只有当第三列有“基因”时,我才想替换不同的字符串。但是第 9 列的字符串应该根据第二个文件中的信息来替换,比如这个文件(带有标签):
spa-h0003.02 spa-cap_Chr1_00M
spa-h0004.02 spa-cap_Chr1_18
我不知道该怎么做。我在想类似的东西(XX应该是第二个文件中的信息?):
cat file | awk '$3 == "gene" && $9 == "spa-" {$9 = "XX"} {print}'
但是我如何使用第二个文件中的信息呢?也许:
while read n k; do sed -i 's/$n/$k/g' file1; done < fileA
一个不受欢迎的选择:Tcl。Tcl 有一个很好的
string map
命令可以完成这个任务。不幸的是,Tcl 并不是真正为 perl-ish 单行代码构建的。使用 awk,我会写:
假设
file1
包含要替换的文本,file2
包含替换文本,并且您可以依靠ID=
来执行两者之间的查找,您可以使用这个(我猜更流行)awk 脚本: