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 或更高,情况就会有所不同。因此,可能需要稍作更改(需要bash
、zsh
或其他理解<(command)
语法的 shell:
comm -23 <(sort file1.txt) <(sort file2.txt)
comm
采用三个重要参数 --1
,它抑制仅存在于第一个文件中的行,-2
,它抑制仅存在于第二个文件中的行,以及-3
,它抑制两个文件中存在的行。因此-23
最终只打印第一个文件唯一的行。-13
将打印第二个文件唯一的行。