我在这里学习了如何使用 comm 比较 2 个已排序(使用排序)的文件,并显示其中一个文件或两个文件中存在的行/记录。
实际上有些东西并没有真正按预期工作,所以我想获得一些帮助。
假设我有几个已排序的文件,每个文件大约有 200k 条记录,其中一些行是常见的 - 出现在之前排序的两个文件中。然后执行这个命令:
comm -i -23 file1 file2 > test_01
很简单。期望 test_01 中有记录/行仅有的出现在file1中。但输出 - test_01 - 包含两个文件中都存在的行/记录。
这两个文件都只包含普通的电子邮件地址 - 每列一列。如上所述,之前使用排序实用程序进行了排序。每个文件都有不同数量的记录。确实确认(使用 grep)test_01 输出文件包含 file1 和 file2 中存在的记录。
根据上面的流程描述,我做错了什么吗?
答案1
考虑这个例子:
$ comm -23 L R > Z
$ head -n 9999 L R Z
==> L <==
Easy one
Easy one
Final Two
==> R <==
Easy one
Final Two
==> Z <==
Easy one
$
这列出了包含 "only" 的第 1 列Easy one
,尽管该文本出现在两个文件中。一对匹配,第二对是多余的行,仅在文件 L 中。如果列出所有三列,则这一点很清楚:
$ comm L R
Easy one
Easy one
Final Two
$
我无法在 Linux 上测试该-i
选项,但没有理由怀疑它不起作用。但是,sort
没有-i
选项,因此输入可以按大小写排序,然后在不区分大小写的情况下进行比较。
我建议在检查差异tr 'a-z' 'A-Z' | sort | uniq
之前传递每个文件。comm
如果您显示几行真实数据,并且可以仅使用几行来隔离示例,那将会很有帮助。空白(空格、制表符、CR)可能会微妙地影响结果。
awk
可能是一个更好的选择。通过使用数组,它可以比较未排序的数据、均衡空白、忽略大小写,并且仍然报告原始行号和数据。