区分两个大文本文件


32

我有两个大文件(每个6GB)。它们是未排序的,使用换行符(\n)作为分隔符。我该如何区分它们?它应该在24小时之内。

Answers:


45

最明显的答案是仅使用diff命令,向其添加--speed-large-files参数可能是一个好主意。

diff --speed-large-files a.file b.file

您提到未排序的文件,所以也许您需要先对文件进行排序

sort a.file > a.file.sorted
sort b.file > b.file.sorted
diff --speed-large-files a.file.sorted b.file.sorted

您可以通过将第二个排序输出直接传递给diff来保存创建额外的输出文件

sort a.file > a.file.sorted
sort b.file | diff --speed-large-files a.file.sorted -

显然,这些方法在具有足够可用内存的系统上运行最佳,并且您可能还需要大量可用磁盘空间。

从您的问题尚不清楚您是否曾经尝试过这些。如果是这样,那么知道出了什么问题(花了太长时间等)将很有帮助。我总是发现,除非有一些非常特定于域的文件属性可以使用不同的方法,否则Stock sort和diff命令的作用至少与自定义命令一样。


2
+1。您可以省略所有带有命名管道的临时文件。使用mkfifo创建[ab].file.sorted利用它们作为输出之前sort。把这两样sorts的&背景,并使用管道都作为文件名的差异。
krissi

15
@krissi您也可以使用以下语法实现相同的效果:diff <(command 1) <(command 2)
Michael Mrozek

谢谢工作。我需要几个GB的内存,但是一个16GB的Amazon EC2实例修复了它:)
jonasl 2010年

7
如果像我这样的人想知道<(cmd1) <(cmd2)语法为何起作用(这听起来像两次将标准输入重定向!),请尝试echo hello <(cmd1) <(cmd2)。您会看到类似的东西hello /dev/fd/63 /dev/fd/62突然变得清晰起来;)
alex

3
以我的经验,--speed-large-files如果您没有足够的RAM ,该选项将无济于事。同样,如果您希望保留多行记录结构,则预排序也无济于事。(由@unhammer)上文提到的选项是有趣的,但来自输出rdiffbsdiff比较二进制。bdiff从Heirloom工具箱安装看起来像是一项艰巨的任务(需要Heirloom devtools,已存在的头文件等)。真的值得付出努力吗?还有其他选择吗?
Christian Pietsch

5

对输入进行排序,并告诉diff程序其输入已排序,将会大大提高速度。我不知道diff有这样的选项,但是comm假设输入是经过排序的,如果可以满足您的需求,它将更快。


comm为此,它发挥了很大的作用,以前从未听说过,但显然在coreutils中已听说过。
theferrit32
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.