【问题标题】:Compare two delimited files field by field and find the missing and non matching records逐个字段比较两个分隔文件并找到丢失和不匹配的记录
【发布时间】:2017-07-19 15:55:20
【问题描述】:

两个输入文件,每个文件有 3 个字段。两个文件中的前两个字段必须匹配,第三个字段必须进行比较。

    File1
A ; 1 ; a1
B ; 2 ; b2
C ; 3 ; c3
A ; 4 ; a4


 File 2
B ; 2 ; b2
C ; 3 ; c5
E ; 5 ; e5

我想要如下输出。

Mismatching: 
C ; 3 ; c3

Lines missing in file1:
E ; 5 ; e5

Lines missing in file2: 
A ; 1 ; a1
A ; 4 ; a4

我还想要 file1 和 file2 中缺少的记录。

我试过了

awk 'BEGIN {FS = ";"} NR==FNR{a[$1,$2] = $3; next} (a[$1,$2] != $3)' file1 file2

但这只会给我 file2 中的行,而 file1 中不存在..

【问题讨论】:

  • 你很幸运,档案中充满了如何做到这一点的例子。只需搜索它们。
  • 我试过 awk 'BEGIN {FS = ";"} NR==FNR{a $1,$2} = $3; next} (a[$1,$2] != $3)' file1 file2.. 但这只是给我 file2 中 file1 中不存在的行。
  • 你为什么不在file1和file2交换的情况下再次调用脚本呢? (获取file1中不存在于file2中的行)

标签: shell awk


【解决方案1】:
$ awk -F';' '
   NR==FNR{a[$1","$2]=$0; next}

   $1","$2 in a{if(a[$1","$2] != $0)mm=mm $0 RS; delete a[$1","$2]; next}
   {nf=nf $0 RS}

   END{print "Mismatching:\n" mm;
       print "Lines missing in file1:"; for(i in a)print a[i];
       print "\nLines missing in file2:\n" nf}
   ' file2 file1
Mismatching:
C ; 3 ; c3

Lines missing in file1:
E ; 5 ; e5

Lines missing in file2:
A ; 1 ; a1
A ; 4 ; a4
  • $1","$2 in a 如果在 a 中找到前两个字段
    • 如果a 中的值与当前行不匹配,则将该行附加到变量mm(不匹配行)
    • a 中删除键,这样最后未调用的键都会丢失行
  • nf=nf $0 RS 如果在a 中找不到密钥,那么我们会在传递给awk 的第一个文件参数中找到行
  • END{...} 按要求打印


最好将代码保存在文件中并使用-f调用它

$ cat cmp.awk 
NR==FNR{a[$1","$2]=$0; next}

$1","$2 in a{if(a[$1","$2] != $0)mm=mm $0 RS; delete a[$1","$2]; next}
{nf=nf $0 RS}

END{print "Mismatching:\n" mm;
    print "Lines missing in file1:"; for(i in a)print a[i];
    print "\nLines missing in file2:\n" nf}

$ awk -F';' -f cmp.awk file2 file1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    相关资源
    最近更新 更多