linux - 如何比较两个大文件并将结果输出到第三个文件?

标签 linux bash shell unix

我有两个文件

第一个文件是这样的:

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/

相关文章:

c - 用C程序杀死一个进程

windows - 无法在 Git Bash 中将 Meld 设置为 diff 工具

python - python 在 bash 中可以像这样吗?

linux - 识别长时间运行进程的 PID

shell - (如何)是否可以仅向那些使用标准 shell 命令和/或 Unix utils 已经拥有 r 权限的人添加 x 权限?

linux - Bash 退格字符的正确使用

node.js - 如何将 32 位 node.js(8.5.0) 安装到 64 位 ubuntu(17.0)?

bash - Flutter 桌面 - 将 PDF 发送到打印机

c++ - 在 linux 上用 C++ 创建一个 ramdisk

linux - 休息时的 at 命令可以简化吗?