如何比较两个大文件并获得第三个文件的结果?

Mar*_*cik 1 unix linux bash shell

我有两个文件

第一个文件是这样的:

www.example.com
www.domain.com
www.otherexample.com
www.other-domain.com
www.other-example.com
www.exa-ample.com
Run Code Online (Sandbox Code Playgroud)

第二个文件是这样的(;;;后面的数字在0-10之间):

www.example.com;;;2
www.domain.com;;;5
www.other-domain;;;0
www.exa-ample.com;;;4
Run Code Online (Sandbox Code Playgroud)

我想比较这两个文件并输出到第三个文件,如下所示:

www.otherexample.com
www.other-example.com
Run Code Online (Sandbox Code Playgroud)

两个文件都很大(超过 500mb)

cam*_*amh 5

使用comm(1)比较两个排序的文件,并给予差异。使用grep(1)sort(1)将文件转换为适合与comm. 使用过程中替换bash共同比分扳成:

comm -23 <(sort file1.txt) <(grep -o '^[^;]*' file2.txt | sort)
Run Code Online (Sandbox Code Playgroud)

-23参数comm表示忽略文件 ( -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 中的拼写错误。

这会并行运行所有进程并通过它们流式传输文件数据,因此即使文件很大,也不会占用大量内存或任何额外的磁盘空间来存储临时文件。