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)
使用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 中的拼写错误。
这会并行运行所有进程并通过它们流式传输文件数据,因此即使文件很大,也不会占用大量内存或任何额外的磁盘空间来存储临时文件。