【问题标题】:compare two file for match, print only one if duplicate matching found比较两个文件是否匹配,如果发现重复匹配则只打印一个
【发布时间】:2018-11-27 16:36:37
【问题描述】:

我有两个文件。文件 1 和文件 2。 File2 有一些重复的条目,由于文件结构的复杂性,我无法删除它们。现在,在生成 File3 时,它将在 File1 和 File2 之间具有匹配的第一列和第二列;我只想从 File2 中获得一个条目来匹配 File1 中的模式。什么是最好的方法来做到这一点。我尝试了awk 'NR==FNR{a[$1,$2]=$0;next} ($1,$2) in a{print $0}' File1 File2,但它保留了 File2 中的所有匹配条目

File1
ab 12
cd 24
ef 56

File2
ab 12
ab 12
ef 56

得到的是

File3
ab 12
ab 12
ef 56

但我想要的是

File3
ab 12
ef 56

谢谢

【问题讨论】:

    标签: awk


    【解决方案1】:

    还有一些方法,

    输入:

    $ cat f1
    ab 12
    cd 24
    ef 56
    
    $ cat f2
    ab 12
    ab 12
    ef 56
    

    输出:

    $ awk '{k=$1 SUBSEP $2}FNR==NR{a[k]; next}k in a && !a[k]++' f1 f2
    ab 12
    ef 56
    

    为了更好的可读性++a[k]==1(考虑线程标题“比较两个文件是否匹配,如果发现重复匹配则只打印一个”)

    $ awk '{k=$1 SUBSEP $2}FNR==NR{a[k]; next}k in a && ++a[k]==1' f1 f2
    ab 12
    ef 56
    

    【讨论】:

      【解决方案2】:

      找到匹配行后,您需要从a 中删除该条目。

      awk 'NR==FNR {a[$0]; next} ($0 in a) {delete a[$0]; print}' File1 File2
      

      【讨论】:

      • 感谢您的回复。但我试图避免 sort 命令。实际上我的 File2 是一个 fastq 文件。总之谢谢。我知道了一个新命令'comm'
      猜你喜欢
      • 2014-08-28
      • 1970-01-01
      • 1970-01-01
      • 2019-11-11
      • 2021-06-15
      • 2012-09-05
      • 2017-07-30
      • 1970-01-01
      • 2021-06-26
      相关资源
      最近更新 更多