我试图找到以下解决方案。我在第一列中列出了基因ID,在所有其他列中都列出了相关的GO术语。因此,每个基因ID后面的列数是可变的。如下几行:
TRINITY_DN173118_c0_g1 GO:0000139^cellular_component^Golgi membrane
TRINITY_DN49436_c2_g1 GO:0006351^biological_process^transcription, DNA-templated
TRINITY_DN47442_c0_g1 GO:0003677^molecular_function^DNA binding GO:0006302^biological_process^double-strand break repair GO:0006310^biological_process^DNA recombination
GO术语用制表符分隔。我想保留第一列,其中包含ID和所有包含“ biological_process”的列。但是我该如何使用awk进行操作,而没有要搜索的特定列。
我基本上想对列使用grep,因此尝试使用awk进行操作(但是我完全没有awk的经验):
awk '/biological_process/'
->我得到了整行
awk '{ print "biological_process" }'
->我只会经历生物学过程
有人可以帮我吗?谢谢!
答案 0 :(得分:2)
AWK:
awk -F"GO:" '{printf "%s",$1}{for(i=2;i<=NF;i++) if ($i~/biological_process/)printf FS"%s",$i ;print ""}' file
1)-F"GO:"
-使用“ GO:”字符串作为分隔符
2){printf "%s",$1}
-打印第一列(没有新行)
3)for(i=2;i<=NF;i++)
-在第一个列旁边的所有列上运行
4)($i~/biological_process/)
-检查字符串是否存在于列中
5)printf FS"%s",$i
-如果列中存在字符串,则打印分隔符和字符串
6)print ""
-打印新行
使用的输入文件:
TRINITY_DN173118_c0_g1 GO:0000139^cellular_component^Golgi membrane
TRINITY_DN49436_c2_g1 GO:0006351^biological_process^transcription, DNA-templated
TRINITY_DN47442_c0_g1 GO:0003677^molecular_function^DNA binding GO:0006302^biological_process^double-strand break repair GO:0006310^biological_process^DNA recombination
输出
TRINITY_DN173118_c0_g1
TRINITY_DN49436_c2_g1 GO:0006351^biological_process^transcription, DNA-templated
TRINITY_DN47442_c0_g1 GO:0006302^biological_process^double-strand break repair GO:0006310^biological_process^DNA recombination
感谢Ed Morton的反馈,我已经编辑了答案:)。
答案 1 :(得分:1)
另一个类似的awk
$ awk 'BEGIN {FS=OFS="\t"}
{line=$1;
for(i=2;i<=NF;i++) if($i~/biological_process/) line=line OFS $i;
print line}' file
TRINITY_DN173118_c0_g1
TRINITY_DN49436_c2_g1 GO:0006351^biological_process^transcription, DNA-templated
TRINITY_DN47442_c0_g1 GO:0006302^biological_process^double-strand break repair GO:0006310^biological_process^DNA recombination