说我是否有两个文件 -
1|abc
2|cde
3|pkr
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和文件2是从不同数据库导出的表。它有两个由管道分隔符分隔的字段。字段1 始终唯一。场2可以是相同的。
我的目的是在其上运行awk
一个班轮以找到真正的差异。如果我运行上面所述的命令两次(首先将文件1传递给第一次运行,将文件2首先传递给第二次运行),我得到两个都缺少的记录。但是,我想在单程中做到这一点。
答案 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
>