Answers:
最明显的答案是仅使用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命令的作用至少与自定义命令一样。
diff <(command 1) <(command 2)
<(cmd1) <(cmd2)
语法为何起作用(这听起来像两次将标准输入重定向!),请尝试echo hello <(cmd1) <(cmd2)
。您会看到类似的东西hello /dev/fd/63 /dev/fd/62
突然变得清晰起来;)
--speed-large-files
如果您没有足够的RAM ,该选项将无济于事。同样,如果您希望保留多行记录结构,则预排序也无济于事。(由@unhammer)上文提到的选项是有趣的,但来自输出rdiff
和bsdiff
比较二进制。bdiff
从Heirloom工具箱安装看起来像是一项艰巨的任务(需要Heirloom devtools,已存在的头文件等)。真的值得付出努力吗?还有其他选择吗?
对输入进行排序,并告诉diff
程序其输入已排序,将会大大提高速度。我不知道diff
有这样的选项,但是comm
假设输入是经过排序的,如果可以满足您的需求,它将更快。
comm
为此,它发挥了很大的作用,以前从未听说过,但显然在coreutils中已听说过。
mkfifo
创建[ab].file.sorted
利用它们作为输出之前sort
。把这两样sort
s的&
背景,并使用管道都作为文件名的差异。