首页 > 解决方案 > 比较两个文本文件,如果第二个文件的行包含第一个文件的两列,则删除该行

问题描述

我有两个文件,如下所示。file1 有两列,file2 有不同数量的列,具体取决于行。我想比较这两个文件,如果 file1 的 $1 和 $2 都在 file2 的一行中,我想删除该行。file2 也用逗号分隔。如何使用 awk 做到这一点?或任何其他文本处理工具?

文件 1

5052 5051  
4952 4951  

文件2

         2001,       5052,       7001,       5051,       1000  
         2002,       5052,       7001,       1500,       2500  
         2003,       5051,       3500,       4500,       4952  
         2004,       4952,       4999,       4500,       4951  
        

预期输出:

         2002,       5052,       7001,       1500,       2500  
         2003,       5051,       3500,       4500,       4952  
      

我试过下面的 awk 代码但没有运行。

awk 'NR==FNR{A[$1]=$1;A[$2]=$2; next} {if ($0=A[$1] && $0=A[$2]){next} else {print $0}' file1 file2 >> test.inp

标签: linuxawksedtext-processing

解决方案


这假设 file1 中的对在两个字段中永远不会具有相同的值:

$ cat tst.awk
NR==FNR {
    pairs1[NR] = $1
    pairs2[NR] = $2
    next
}
{
    orig = $0
    gsub(/[[:space:],]+/," ")
    delete vals
    for (i=1; i<=NF; i++) {
        vals[$i]
    }
    for (nr in pairs1) {
        if ( (pairs1[nr] in vals) && (pairs2[nr] in vals) ) {
            next
        }
    }
    print orig
}

$ awk -f tst.awk file1 file2
         2002,       5052,       7001,       1500,       2500
         2003,       5051,       3500,       4500,       4952

推荐阅读