Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何比较两个大文件并将结果发送到第三个文件?_Linux_Bash_Shell_Unix - Fatal编程技术网

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也许你可以根据这篇帖子尝试一下rdiff
diff:with diff,我得到的信息是:diff:memoryexhausted@MartinMocik根据这篇文章,也许你可以尝试一下rdiff:这对你来说会非常慢一组文件,每个文件的大小为500MB。当然可以,但它可以工作。对于一个简单的C程序来说,这是一个很好的起点。对于一组每个500MB的文件来说,这将是难以置信的慢。当然,但它可以工作。在我的系统上,这是一个简单C程序的良好起点,它花费了
sed
1/8的时间
grep
<代码>时间sed/;*/'文件名>/dev/null
与时间grep-o'^[^;]*'文件名>/dev/null
对于一个包含GNU
grep
2.5.4和GNU
sed
4.2的900KB文件。1@DennisWilliamson:有趣。在过去,我让grep工作的速度快了很多。感谢您提供的数据。这在很大程度上取决于数据和其他因素。我的
grep'foo'| awk'{…}'
awk'/foo/{…}'
要快得多,因为它是一个更复杂的“foo”。在我的系统上,它花费了
sed
1/8的时间<代码>时间sed/;*/'文件名>/dev/null
与时间grep-o'^[^;]*'文件名>/dev/null对于一个包含GNU
grep
2.5.4和GNU
sed
4.2的900KB文件。1@DennisWilliamson:有趣。在过去,我让grep工作的速度快了很多。感谢您提供的数据。这在很大程度上取决于数据和其他因素。对于一个更复杂的“foo”,我的
grep'foo'| awk'{…}'
awk'/foo/{…}'
要快得多。Re:“逐行剥离最后一部分处理它”:可以用
Re:“逐行剥离最后一部分处理它”:这可以通过replaci完成