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

Linux 如何使用awk查找两个文件之间的不匹配记录,linux,shell,awk,Linux,Shell,Awk,文件1 文件2 1|footbal|play1 2|cricket1|play2 3|golf|play3 4|tennis|play4 5|bowling|play5 我正在比较file2和file1,输出应该是 1|footbal|play1 2|cricket|play2 4|tennis|play4 我只需要文件2中不存在且应该在文件1中的记录 3|golf|play3 5|bowling|play5 这没有给出预期的结果。编辑:再次尝试通过将第一个字段作为索引键来获取OP的预期输

文件1

文件2

1|footbal|play1
2|cricket1|play2
3|golf|play3
4|tennis|play4
5|bowling|play5
我正在比较file2和file1,输出应该是

1|footbal|play1
2|cricket|play2
4|tennis|play4
我只需要文件2中不存在且应该在文件1中的记录

3|golf|play3
5|bowling|play5
这没有给出预期的结果。

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

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


您的代码看起来不错,请尝试以下内容。您的示例中可能有一个if-control M字符。在处理它们之前,请尝试删除它们

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


我还将删除最后一行中的空格,以备不时之需。

您当然可以使用awk,但它专门用于打印两个文件之间的共性和差异:

awk '{gsub(/\r|[[:space:]]+$/,"")} NR==FNR {exclude[$0];next} !($0 in exclude)' file2.txt file1.txt
(考虑到预期的输出,我假设示例文件1中的
cricket1
是一个输入错误)


问题是这些文件必须按字典顺序排序,而根据您的示例,您的文件是根据第一列进行数字排序的,如果您有10或更高的值,这就不同了。因此,可能需要一个小的改变(需要
bash
zsh
,或者另一个理解
的shell。请根据论坛规则编辑您的问题,并将您的示例包装在代码标签中。如果您的文件已排序,那么我想只需
comm-23
。这可能有助于您在文件2中拥有
2 | cricket1 | play2
int文件1和
2 | cricket play2
不是故意的?/一个简单的方法是
grep-F-v-F file2 file1
@rakeshkandukuri,Rakesh,你没有回答我和大卫的问题,程序怎么知道你认为板球和板球是一样的?我已经删除了我的答案,直到这个问题清楚为止。
$ comm -23 file1.txt file2.txt
3|golf|play3
5|bowling|play5
comm -23 <(sort file1.txt) <(sort file2.txt)