【发布时间】:2021-06-25 08:52:15
【问题描述】:
我正在尝试使用一个文件中的字段来查找另一个文件中的所有匹配项,然后打印两个文件中的所有值。我想将文件一的第一个字段与文件二的第一个字段匹配。并且对于来自两个文件的匹配打印字段的所有可能组合。类似:
file_1.txt:
1051mF-Z1 PHH67392.1 241796 bb_indole
1051mF-Z1 PHH67369.1 188011 bb_T1PKS
和
file_2.txt
1051mF-Z1 PHH67296.1 2611 PF00083.25
1051mF-Z1 PHH67296.1 2611 PF06609.14
1051mF-Z1 PHH67296.1 2611 PF07690.17
1051mF-Z1 PHH67305.1 29486 PF07883.12
1051mF-Z2 PHH58939.2 33999 PF11110.39
1051mF-Z3 PHH58936.2 55599 PF41114.2
期望的输出:
1051mF-Z1 PHH67296.1 2611 PF00083.25 1051mF-Z1 PHH67392.1 241796 bb_indole
1051mF-Z1 PHH67296.1 2611 PF06609.14 1051mF-Z1 PHH67392.1 241796 bb_indole
1051mF-Z1 PHH67296.1 2611 PF07690.17 1051mF-Z1 PHH67392.1 241796 bb_indole
1051mF-Z1 PHH67305.1 29486 PF07883.12 1051mF-Z1 PHH67392.1 241796 bb_indole
1051mF-Z1 PHH67296.1 2611 PF00083.25 1051mF-Z1 PHH67369.1 188011 bb_T1PKS
1051mF-Z1 PHH67296.1 2611 PF06609.14 1051mF-Z1 PHH67369.1 188011 bb_T1PKS
1051mF-Z1 PHH67296.1 2611 PF07690.17 1051mF-Z1 PHH67369.1 188011 bb_T1PKS
1051mF-Z1 PHH67305.1 29486 PF07883.12 1051mF-Z1 PHH67369.1 188011 bb_T1PKS
但是我一直在使用的代码:
awk 'NR==FNR{a[$1]=$0; next} {print $0,a[$1]}' file_1.txt file_2.txt
只给我第一个文件第一行的匹配项而忽略第二个?
当前输出:
1051mF-Z1 PHH67296.1 2611 PF00083.25 1051mF-Z1 PHH67392.1 241796 bb_indole
1051mF-Z1 PHH67296.1 2611 PF06609.14 1051mF-Z1 PHH67392.1 241796 bb_indole
1051mF-Z1 PHH67296.1 2611 PF07690.17 1051mF-Z1 PHH67392.1 241796 bb_indole
1051mF-Z1 PHH67305.1 29486 PF07883.12 1051mF-Z1 PHH67392.1 241796 bb_indole
任何建议将不胜感激!我已经能够通过循环来做到这一点——但这需要很长时间,我希望尽可能使用 awk one 班轮来做到这一点。
【问题讨论】:
-
您的 awk 脚本的问题是,仅 file1 的第一列并不是唯一的。映射最终将有一个键,值是 file1 的最后一条记录。代码中提供的脚本也没有给出提到的输出。