文件1:
abc|123|check
def|456|map
ijk|789|globe
lmn|101112|equator
文件2:
abc|123|check
def|456|map
ijk|789|equator
lmn|101112|globe
预期输出:
ijk|789|equator
lmn|101112|globe
当前的 awk 脚本:
awk 'BEGIN{OFS=FS="|"} NR==FNR{a[$3]=$3;next}!($3 in a)' file1 file2
这会根据数组内容进行比较。如何逐行比较并仅打印结果。
答案1
如果我理解正确的话,如果第三个字段与 file1 中的相应条目不同,您想从 file2 中打印一行。如果是这样,应该这样做:
awk 'BEGIN{FS="|"} NR==FNR{a[$1,$2]=$3;next}(a[$1,$2]!=$3)' file1 file2
你的不起作用,因为你将其$3
作为数组的键a
并且$3
不是唯一的(两者equator
都globe
存在于两个文件中)。
我同意 @drewbenn 的观点,对于这个特殊情况,grep
和join
都更简单,但这里有一个 Perl 方法来做同样的事情:
perl -laF'\|' -ne '($k{$F[0].",".$F[1]}||=$F[2]) eq $F[2]||print;' file1 file2
答案2
我想你想用join
(或grep -f
) 代替。但如果你必须使用 awk:
echo | awk '{system("join -v 2 file1 file2")}'
这只是一个 awk 前端join -v 2 file1 file2
。同样,当然,您可以使用grep -v -f file1 file2
.
答案3
comm
是这项工作的真正工具:
comm -13 file1 file2
ijk|789|equator
lmn|101112|globe
如果输入文件尚未排序:
comm -13 <(sort file1) <(sort file2)