awk - 对于列中的每个唯一值,提取行并单独保存
问题描述
有没有办法分别提取具有相似值的行并分别保存?我的文件如下
319 Eukaryota;Alveolata;Apicomplexa;Aconoidasida;Piroplasmorida;Babesia;Babesia;Babesia_canis_canis;AY072926.1.1714; 88e823b2-69c5-4be5-9338-f5ce58c41ae0
443 Eukaryota;Alveolata;Apicomplexa;Aconoidasida;Piroplasmorida;Babesia;Babesia;Babesia_conradae;AF158702.1.1717; 01a792e5-de00-43bb-9918-8d692a7b3226
355 Eukaryota;Alveolata;Apicomplexa;Aconoidasida;Piroplasmorida;Babesia;Babesia;Babesia_duncani;HQ285838.1.1768; 1a9762a7-b4aa-4824-a416-5986d62a43e2
313 Eukaryota;Alveolata;Apicomplexa;Aconoidasida;Piroplasmorida;Babesia;Babesia;Babesia_duncani;HQ285838.1.1768; 1c89bfe3-3cff-4c29-b8c9-1bc2801106b7
464 Eukaryota;Alveolata;Apicomplexa;Aconoidasida;Piroplasmorida;Babesia;Babesia;Babesia_duncani;HQ285838.1.1768; 2a16a0ca-7395-4c82-8c76-13ee3121a177
419 Eukaryota;Alveolata;Apicomplexa;Aconoidasida;Piroplasmorida;Babesia;Babesia;Babesia_duncani;HQ285838.1.1768; 459673b9-73a8-4044-9c0e-df30fae71ac7
321 Eukaryota;Alveolata;Apicomplexa;Aconoidasida;Piroplasmorida;Theileria;Theileria;Theileria_annulata;AY508467.1.1741; 4c8b0eb7-31fe-4001-bdf2-9c75b55cce13
307 Eukaryota;Alveolata;Apicomplexa;Aconoidasida;Piroplasmorida;Theileria;Theileria;Theileria_annulata;DQ287944.1.1732; 0bbaa64e-9b4d-4891-88df-dadaacbfa10c
481 Eukaryota;Alveolata;Apicomplexa;Aconoidasida;Piroplasmorida;Theileria;Theileria;Theileria_annulata;KT367879.1.1727; 0f12631e-1004-4b59-af15-11f9fa387efa
我想要的结果是为每个唯一的第二列提取所有行的第三列:
Babesia_canis_canis 的 file1;
88e823b2-69c5-4be5-9338-f5ce58c41ae0
Babesia_conradae 的文件 2;
01a792e5-de00-43bb-9918-8d692a7b3226
Babesia_duncani 的文件 3;
1a9762a7-b4aa-4824-a416-5986d62a43e2
1c89bfe3-3cff-4c29-b8c9-1bc2801106b7
2a16a0ca-7395-4c82-8c76-13ee3121a177
459673b9-73a8-4044-9c0e-df30fae71ac7
Theileria_annulata 的文件 4;
4c8b0eb7-31fe-4001-bdf2-9c75b55cce13
0bbaa64e-9b4d-4891-88df-dadaacbfa10c
0f12631e-1004-4b59-af15-11f9fa387efa
我试过 awk 但我无法分离文件:
awk '{c[$2]++; a[$2]=a[$2]?a[$2]RS$0:$0}
END{for(k in a) if(c[k]>1) print a[k]}' file
解决方案
您的方法似乎有效,但并不完全。您需要awk
根据唯一标识符名称来索引数组。例如Babesia_canis_canis
。在分隔符上拆分第二列;
并提取n-2
第 th 索引处的值arr
将具有唯一键。
awk '{
n = split($2, arr, ";")
key = arr[n - 2]
unique[key] = unique[key] ? unique[key] RS $NF : $NF
}
END {
for (id in unique) {
print unique[id] > id
}
close(id)
}' file
应该适用于任何awk
,因为没有使用 GNU 特定的构造。通过减少写入次数,这在磁盘 I/O 方面是有效的,但将每行的内容存储在内存中。
推荐阅读
- java - 在递归循环中检测 JDBC 连接泄漏的插件/工具
- powerbi - Power Bi 用表中的值替换固定列表值
- python - 在 Pandas 中读取由空格分隔的字符串数据
- javascript - @click 的样式绑定 - vue.js
- apache-spark - Spark Structured Streaming - UI 存储内存值不断增长
- pdf - 创建 PDF 时 Phantom JS 2.1.1 中的 URL 编码问题
- jenkins - 管道 DSL:动态更改构建名称
- r - 是否可以使用模型列表自动化 plot_summs?
- service-worker - 电子邮件中的 url 链接,如何打开现有的应用程序选项卡而不是在新选项卡上重新加载应用程序
- sql - 如何根据 column2 中的字符串更新 column1?