unix - 对所有列使用 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" }'
-> 我只得到了生物过程
有人可以帮我吗?谢谢!
解决方案
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的反馈,我已经编辑了答案:)。
推荐阅读
- jquery - 滚动 jquery var 上的粘性导航未更新
- html - 选择与文本内联的元素
- php - 在 php 中使用 sqlsrv 调用 SQL 存储过程并获取返回成功或失败
- ios - swift for循环遍历json对象不会为字符串添加值
- laravel - Laravel Horizon worker:空闲内存使用
- c++ - 如何将一些文本保存到包含空格的字符串中?
- android - 如何使用 FCM 在颤振中推送通知
- javascript - 我的自定义滑块图像显示在原始域上,但不在虚拟域上(仅适用于移动设备)
- python - Docker Python API 更新方法生成 TypeError: unhashable type: 'dict'
- python - 错误:无法为使用 PEP 517 且无法直接安装的 esmre 构建轮子