如何使用awk查找两个文件之间的不匹配记录



file1

1|footbal|play1
2|cricket1|play2
3|golf|play3
4|tennis|play4
5|bowling|play5

文件 2

1|footbal|play1
2|cricket|play2
4|tennis|play4

我正在比较文件2与文件1,输出应该是

3|golf|play3
5|bowling|play5

我只需要文件2中不存在并且应该在文件1中的记录。

awk 'NR==FNR {exclude[$0];next} !($0 in exclude)' file2.txt file1.txt

这没有给出预期的结果。

编辑: 再次尝试通过将第一个字段作为索引键来获取 OP 的预期输出。

awk '
BEGIN{
FS="|"
}
NR==FNR{
exclude[$1]
next
}
!($1 in exclude)
' file2.txt file1.txt


您的代码看起来不错,您能否尝试以下示例中可能存在 if 控件 M 字符。在处理它们之前尝试删除它们。

awk '{gsub(/r|[[:space:]]+$/,"")} NR==FNR {exclude[$0];next} !($0 in exclude)' file2.txt file1.txt

我还从最后一行中删除空格,以防万一。

你当然可以使用awk,但comm是专门为打印两个文件之间的共性和差异而构建的:

$ comm -23 file1.txt file2.txt
3|golf|play3
5|bowling|play5

(鉴于您的预期输出,我假设您的示例 file1 中的cricket1是一个错字(。

问题是文件必须按字典顺序排序,而根据您的样本,您的文件根据第一列按数字排序,一旦您有 10 或更高,情况就会有所不同。因此,可能需要稍作更改(需要bashzsh或其他理解<(command)语法的 shell:

comm -23 <(sort file1.txt) <(sort file2.txt)
comm采用三个重要参数 --1,它抑制仅存在于第一个文件中的行,-2

,它抑制仅存在于第二个文件中的行,以及-3,它抑制两个文件中存在的行。因此-23最终只打印第一个文件唯一的行。-13将打印第二个文件唯一的行。

最新更新