【问题标题】:use fields in one file to find fields in another and print all matches with fields from both使用一个文件中的字段来查找另一个文件中的字段,并打印与两个文件中的字段的所有匹配项
【发布时间】: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 的最后一条记录。代码中提供的脚本也没有给出提到的输出。

标签: macos awk


【解决方案1】:

使用 GNU 连接?

例如

join -j1 -o 2.1,2.2,2.3,2.4,1.1,1.2,1.3,1.4 <(sort -k1,1 file1.txt) <(sort -k1,1 file2.txt)

解释:

-j1: 在第一列加入两个文件

-o 2.1,2.2,2.3,2.4,1.1,1.2,1.3,1.4:指定输出顺序(2.1 表示第二个文件,第一列,2,2 表示第二个文件第二列等 - 你可以改变这个以适应)

&lt;(sort -k1,1 file1.txt) / &lt;(sort -k1,1 file2.txt) join 需要对两个文件进行排序,因此在它们的第一列进行排序 (sort -k1,1)

【讨论】:

    猜你喜欢
    • 2011-04-26
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 2015-09-20
    • 2014-01-20
    • 1970-01-01
    • 2015-11-11
    相关资源
    最近更新 更多