使用awk列出两个文件中的差异

时间:2013-03-21 13:07:42

标签: awk diff

说我是否有两个文件 -

File1中:

1|abc
2|cde
3|pkr

文件2:

1|abc
2|cde
4|lkg

如何使用awk列出两个文件的真正差异?如果第二个文件是第一个文件的子集,我可以执行以下操作 -

awk -F"|" 'NR==FNR{a[$1]=$2;next} !($1 in a)' file{1,2}

但这会给我

4|lkg

我想获得如下输出,因为这是真正的区别。差异应该被视为:

3|pkr
4|lkg

差异标准:

  • 字段1存在于file1中但不存在于file2中。
  • 字段1存在于file2中但不存在于file1中。
  • 字段1存在于两个文件中但具有不同的值。

某些背景:

文件1和文件2是从不同数据库导出的表。它有两个由管道分隔符分隔的字段。字段1 始终唯一。场2可以是相同的。

我的目的是在其上运行awk一个班轮以找到真正的差异。如果我运行上面所述的命令两次(首先将文件1传递给第一次运行,将文件2首先传递给第二次运行),我得到两个都缺少的记录。但是,我想在单程中做到这一点。

3 个答案:

答案 0 :(得分:4)

如果你真的想使用awk:

$ cat f1
a|1
b|2
c|1
$ cat f2
b|2
c|1
d|0
$ awk '{ h[$0] = ! h[$0] } END { for (k in h) if (h[k]) print k }' f1 f2
a|1
d|0
$

答案 1 :(得分:3)

这是comm的作用:

$ comm -3 <(sort file1) <(sort file2)

如果说a|1位于file1一次且位于file2两次,那么a|1将在输出中出现一次,因为file2中仅出现一次在file1中匹配。如果您不希望出现此行为,并且因为a|1每次至少看一次,则不应在输出中看到,请使用-u选项sort

$ comm -3 <(sort -u file1) <(sort -u file2)

答案 2 :(得分:1)

diff file1 file2 | perl -lne 'if(/^[<>]/){s/^..//g;print}'

以下是测试:

> cat file1
a|1
b|2
c|1
> cat file2
b|2
c|1
d|0
> diff file1 file2 | perl -lne 'if(/^[<>]/){s/^..//g;print}'
a|1
d|0
>