在 awk 中使用分隔符逐行比较文件

在 awk 中使用分隔符逐行比较文件

文件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不是唯一的(两者equatorglobe存在于两个文件中)。

我同意 @drewbenn 的观点,对于这个特殊情况,grepjoin都更简单,但这里有一个 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)

相关内容