0

假设我有两个文件 -

文件1:

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 存在于文件 1 中,但不存在于文件 2 中。
  • 字段 1 存在于文件 2 中,但不存在于文件 1 中。
  • 字段 1 存在于两个文件中,但具有不同的值。

一些背景:

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

我的意图是awk在它上面运行一个班轮以找到真正的差异。如果我两次运行上述命令(第一次运行时首先传递文件 1,第二次运行时首先传递文件 2),我会得到两个都缺少的记录。但是,我想一次性完成。

4

3 回答 3

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
$
于 2013-03-21T13:22:27.357 回答
3

这是做什么comm的:

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

如果 saya|1file1一次和file2两次中出现,那么a|1将在输出中出现一次,因为在 中只有一个file2匹配项file1。如果您不希望这种行为,并且因为a|1在每个中至少出现一次,则不应在输出中看到,然后使用-u选项sort

$ comm -3 <(sort -u file1) <(sort -u file2)
于 2013-03-21T13:33:28.187 回答
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
> 
于 2013-03-21T13:33:22.290 回答