Unix 如何使用AWK根据两个文件之间的公共字段删除一个文件上的重复行?

Unix 如何使用AWK根据两个文件之间的公共字段删除一个文件上的重复行?,unix,awk,Unix,Awk,我有两个文件 文件1包含3个字段 文件2包含4个字段 文件1的行数远小于文件2的行数 我想用以下操作比较基于第1个字段的两个文件 如果文件1任何一行的第一个字段出现在文件2中某一行的第一个字段中,则不要为文件2打印该行 任何建议都将不胜感激 Input File 1 S13109 3739 31082 S45002 3800 31873 S43722 3313 26638 Input File 2 S13109 3738 31081 0 S13109 3737 31080

我有两个文件

  • 文件1包含3个字段

  • 文件2包含4个字段

  • 文件1的行数远小于文件2的行数

    我想用以下操作比较基于第1个字段的两个文件

    如果文件1任何一行的第一个字段出现在文件2中某一行的第一个字段中,则不要为文件2打印该行

    任何建议都将不胜感激

    Input File 1
    
     S13109 3739 31082 
     S45002 3800 31873 
     S43722 3313 26638 
    
    Input File 2
    
     S13109 3738 31081 0 
     S13109 3737 31080 0 
     S00033 3008 29985 0 
     S00033 3007 29984 0 
     S00022 4130 31838 0 
     S00022 4129 31837 0 
     S00188 3317 27372 0 
     S45002 3759 31832 0 
     S45002 3758 31831 0 
     S45002 3757 31830 0 
     S43722 3020 26345 0 
     S43722 3019 26344 0 
     S00371 3737 33636 0 
     S00371 3736 33635 0 
    
    Desired Output
    
     S00033 3008 29985 0 
     S00033 3007 29984 0
     S00022 4130 31838 0 
     S00022 4129 31837 0 
     S00188 3317 27372 0
     S00371 3737 33636 0 
     S00371 3736 33635 0 
    

    awk'FNR==NR{a[$1]++;next}![$1]'文件1文件2

    工作原理:

    FNR==NR
    
    当您有两个(或更多)输入文件要awk时,
    NR
    将在下一个文件的第一行重置回1,而
    FNR
    将从其停止处继续递增。通过检查
    FNR==NR
    我们实际上是在检查当前是否正在解析第一个文件

    a[$1]++
    
    如果我们正在解析第一个文件(见上文),则创建一个关联数组,其中第一个字段
    $1
    作为键,并将值增加1。这本质上让我们可以创建一个“可见”列表

    next
    
    此命令告诉awk不要处理任何进一步的命令,并读入下一条记录并重新开始。之所以这样做,是因为file1仅用于设置关联数组

    !a[$1]
    

    这一行仅在
    FNR==NR
    为false时执行,即我们不分析文件1,因此必须分析文件2。然后,我们使用file2的第一个字段
    $1
    作为索引键,索引到前面创建的“seed”列表中。如果返回的值为0,则表示我们没有在文件1中看到它,因此应打印此行。相反,如果该值不是零,那么我们在file1中确实看到了它,因此不应该打印它的值。请注意,
    ![$1]
    相当于
    !一个[$1]{print}
    ,因为没有给出的默认操作是打印整行。

    如果不需要保留行的顺序,可以在Bash、Korn shell或Z shell中使用进程替换以及
    连接
    排序
    实用程序:

    join -v 2 <(sort file_1) <(sort file_2)
    

    join-v2亲爱的SiegeX。你的解释对我这样的初学者很有启发性。我写这种脚本的问题是,有很多方法可以完成相同的任务,但很难达到最佳的方法。我想这是有经验的。非常感谢您的帮助。FNR将为每个文件重新初始化。NR不断增加。