我有两个文件
第一个文件是这样的:
www.example.com
www.domain.com
www.otherexample.com
www.other-domain.com
www.other-example.com
www.exa-ample.com
第二个文件是这样的(;;;之后的数字在0-10之间):
www.example.com;;;2
www.domain.com;;;5
www.other-domain;;;0
www.exa-ample.com;;;4
我想比较这两个文件并输出到第三个文件,如下所示:
www.otherexample.com
www.other-example.com
两个文件都很大(超过 500mb)
最佳答案
使用 comm(1)
比较两个排序的文件并给出差异。使用 grep(1)
和 sort(1)
将您的文件转换为适合与 comm
进行比较的输入格式。在 bash
中使用 process substitution 将其绑定(bind)在一起:
comm -23 <(sort file1.txt) <(grep -o '^[^;]*' file2.txt | sort)
comm
的 -23
参数表示忽略两个文件 (-3
) 共有的行和文件 2 独有的行(-2
)。根据您的具体规范,您可以使用 -1
、-2
或 -3
。
grep -o '^[^;]*' file2.txt
只是去掉第一个分号后的所有内容。您可以为此使用 sed(1)
,但如果您只是提取一行的一部分而不添加任何其他内容,grep
通常会更快。
comm
需要对输入文件进行排序,因此使用 sort
来做到这一点。输出将被排序。 sort
使用特定于区域设置的排序规则,因此您可能需要根据所需的确切排序规则设置 LC_ALL=C。
请注意,在您的问题中,文件 2 中有 www.other-domain,但文件 1 中有 www.other-domain.com。我假设这是文件 2 中的错字。
这会并行运行所有进程并通过它们流式传输文件数据,因此即使文件很大,也不会占用大量内存或任何额外的磁盘空间来存储临时文件。
关于linux - 如何比较两个大文件并将结果输出到第三个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10831534/