首页 > 解决方案 > 对所有列使用 awk 仅获取部分列内容

问题描述

我试图找到以下解决方案。我在第一列中有一个基因 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" }'-> 我只得到了生物过程

有人可以帮我吗?谢谢!

标签: unixawkgrep

解决方案


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/) - 检查 col 中是否存在字符串

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的反馈,我已经编辑了答案:)。


推荐阅读