【问题标题】:compare two file for match, print all matching found比较两个文件是否匹配,打印找到的所有匹配项
【发布时间】:2019-07-04 02:52:01
【问题描述】:

我正在尝试将 File1 的 column1 的每个条目与 File2 进行比较并打印两者。 File1 的 Column1 可能有重复条目。如果输入重复,我只能看到一个输出行;但我想要两者。

我的代码是awk 'FNR==NR{a[$1]=$0;next}; $1 in a {print $0"\t"a[$1]}' File1.txt File2.txt

文件1.txt

aa  c   d
aa  c   e

文件2.txt

aa  5
aa  7
aa  9
bb  7
cc  1

预期输出

aa  5   aa  c   d
aa  7   aa  c   d
aa  9   aa  c   d
aa  5   aa  c   e
aa  7   aa  c   e
aa  9   aa  c   e

我的代码给出了什么

aa  5   aa  c   e
aa  7   aa  c   e
aa  9   aa  c   e

【问题讨论】:

    标签: awk


    【解决方案1】:

    join 命令的情况如下:

    $ join File{1,2}.txt
    aa c d 5
    aa c d 7
    aa c d 9
    aa c e 5
    aa c e 7
    aa c e 9
    

    输出不是你想要的,所以让我们解决这个问题:

    $ join File{1,2}.txt | awk '{$1 = $1 FS $NF FS $1; $NF = ""; print}'
    aa 5 aa c d
    aa 7 aa c d
    aa 9 aa c d
    aa 5 aa c e
    aa 7 aa c e
    aa 9 aa c e
    

    如果输入文件没有排序,那么(假设你的shell是bash/ksh/zsh)

    join <(sort File1.txt) <(sort File2.txt)
    

    请参阅 bash 手册中的 3.5.6 Process Substitution。

    【讨论】:

    • 如果我的文件没有排序怎么办?
    【解决方案2】:

    sort/join

    $ join <(sort file2) <(sort file1) -o1.1,1.2,2.1,2.2,2.3
    
    aa 5 aa c d
    aa 5 aa c e
    aa 7 aa c d
    aa 7 aa c e
    aa 9 aa c d
    aa 9 aa c e
    

    【讨论】:

      猜你喜欢
      • 2021-06-15
      • 1970-01-01
      • 1970-01-01
      • 2012-09-05
      • 2017-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多