Linux 如何比较两个大文件并将结果发送到第三个文件?
我有两个文件 第一个文件是这样的:Linux 如何比较两个大文件并将结果发送到第三个文件?,linux,bash,shell,unix,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 www.otherexample.com www.other-example.com 第二个文件如下所示(在;;;之后的数字介于0-10之间): 我想比较这两个文件并输出到第三个文件,如下所示: www.example.com www
www.example.com
www.domain.com
www.otherexample.com
www.other-domain.com
www.other-example.com
www.exa-ample.com
www.otherexample.com
www.other-example.com
第二个文件如下所示(在;;;之后的数字介于0-10之间):
我想比较这两个文件并输出到第三个文件,如下所示:
www.example.com
www.domain.com
www.otherexample.com
www.other-domain.com
www.other-example.com
www.exa-ample.com
www.otherexample.com
www.other-example.com
两个文件的大小都很大(超过500mb)您可以使用:
$ diff file1 file2 > file3
但对我来说,你不想理会它;;0零件,对吗?
然后,您需要逐行处理最后一个零件,最后,与diff
相比,您可以使用:
$ diff file1 file2 > file3
但对我来说,你不想理会它;;0零件,对吗?
然后,您需要逐行处理最后一部分,最后,与diff
相比,您可以使用命令将输出定向到第三个文件。例如:
% diff data1.txt data2.txt > diffs
显示了许多选项,可用于控制比较(处理和输出)
假设在文件data1.txt
和data2.txt
中有文章中显示的数据,则不指定选项的基本交互操作将产生:
% diff data1.txt data2.txt
1,6d0
< www.example.com
< www.domain.com
< www.otherexample.com
< www.other-domain.com
< www.other-example.com
< www.exa-ample.com
%diff data1.txt data2.txt
1,6d0
您可以使用该命令将输出定向到第三个文件。例如:
% diff data1.txt data2.txt > diffs
显示了许多选项,可用于控制比较(处理和输出)
假设在文件data1.txt
和data2.txt
中有文章中显示的数据,则不指定选项的基本交互操作将产生:
% diff data1.txt data2.txt
1,6d0
< www.example.com
< www.domain.com
< www.otherexample.com
< www.other-domain.com
< www.other-example.com
< www.exa-ample.com
%diff data1.txt data2.txt
1,6d0
如果a
是包含第一个内容的文件,而b
是包含第二个内容的文件:
while read line; do grep -q $line b || echo $line; done < a
读行时;dogrep-q$行b | | echo$行;完成
它打印在第二个文件中找不到的内容。如果
a
是包含第一个内容的文件,而b
是包含第二个内容的文件:
while read line; do grep -q $line b || echo $line; done < a
读行时;dogrep-q$行b | | echo$行;完成
它打印在第二个文件中找不到的内容。使用comm(1)
比较两个排序的文件并给出差异。使用grep(1)
和sort(1)
将文件转换为适合与comm
进行比较的输入格式。在bash
中使用流程替换将其绑定在一起:
comm -23 <(sort file1.txt) <(grep -o '^[^;]*' file2.txt | sort)
comm-23使用comm(1)
比较两个排序的文件并给出差异。使用grep(1)
和sort(1)
将文件转换为适合与comm
进行比较的输入格式。在bash
中使用流程替换将其绑定在一起:
comm -23 <(sort file1.txt) <(grep -o '^[^;]*' file2.txt | sort)
comm-23如果file2
中的输入包含file1
内容的子集,您可以
sed 's/;.*//' file2 | fgrep -vxf - file1 >not-in-file2
相同的总体思路可应用于diff
或comm
。但是,comm
需要排序输入,但如果这不是问题(或者如果您的数据可以从开始排序),只需对file2
中的数据进行预处理即可
sed 's/;.*//' file2.sorted | comm -12 - file1.sorted >cmp.out
输入需要排序的约束条件是允许comm
处理非常大的文件,因为它只需要在任何时候将最新数据保存在内存中。您可以对自己的自定义awk
脚本执行相同的操作。如果file2
中的输入包含file1
内容的子集,您可以
sed 's/;.*//' file2 | fgrep -vxf - file1 >not-in-file2
相同的总体思路可应用于diff
或comm
。但是,comm
需要排序输入,但如果这不是问题(或者如果您的数据可以从开始排序),只需对file2
中的数据进行预处理即可
sed 's/;.*//' file2.sorted | comm -12 - file1.sorted >cmp.out
输入需要排序的约束条件是允许comm
处理非常大的文件,因为它只需要在任何时候将最新数据保存在内存中。您可以对自己的自定义awk
脚本执行相同的操作。使用diff,我会收到消息:diff:memoryexhausted@MartinMocik也许你可以根据这篇帖子尝试一下rdiffdiff:with diff,我得到的信息是:diff:memoryexhausted@MartinMocik根据这篇文章,也许你可以尝试一下rdiff:这对你来说会非常慢一组文件,每个文件的大小为500MB。当然可以,但它可以工作。对于一个简单的C程序来说,这是一个很好的起点。对于一组每个500MB的文件来说,这将是难以置信的慢。当然,但它可以工作。在我的系统上,这是一个简单C程序的良好起点,它花费了sed
1/8的时间grep
<代码>时间sed/;*/'文件名>/dev/null
与时间grep-o'^[^;]*'文件名>/dev/null
对于一个包含GNUgrep
2.5.4和GNUsed
4.2的900KB文件。1@DennisWilliamson:有趣。在过去,我让grep工作的速度快了很多。感谢您提供的数据。这在很大程度上取决于数据和其他因素。我的grep'foo'| awk'{…}'
比awk'/foo/{…}'
要快得多,因为它是一个更复杂的“foo”。在我的系统上,它花费了sed
1/8的时间<代码>时间sed/;*/'文件名>/dev/null
与时间grep-o'^[^;]*'文件名>/dev/null对于一个包含GNUgrep
2.5.4和GNUsed
4.2的900KB文件。1@DennisWilliamson:有趣。在过去,我让grep工作的速度快了很多。感谢您提供的数据。这在很大程度上取决于数据和其他因素。对于一个更复杂的“foo”,我的grep'foo'| awk'{…}'
比awk'/foo/{…}'
要快得多。Re:“逐行剥离最后一部分处理它”:可以用Re:“逐行剥离最后一部分处理它”:这可以通过replaci完成