2013-04-30 25 views
1

我想使用Linux命令行工具来比较两个非常大的文件(多GB),并查看差异的行数。数据的顺序很重要。如何在使用linux“comm”工具比较文件时显示行号

我在Linux机器上运行,标准diff工具给我“内存耗尽”的错误。 -H没有效果。

在我的应用程序中,我只需要传输差异结果。也就是说,我只是想直观地看看前面的几个区别,我不需要检查整个文件。如果有差异,快速浏览会告诉我什么是错的。

'comm'似乎很适合这种情况,但它不显示行号的差异。

一般来说,我的多GB文件只有几百行不同,其余的文件是一样的。

有没有办法让comm转储行号?还是一种让diff运行而不将整个文件加载到内存的方法? (比如将输入文件切割成1k块,而没有在我的文件系统中创建一百万个1k文件并将所有内容混淆)?

回答

1

我不会用comm,但正如你所说,你需要什么,除了你怎么认为你应该这样做,我会专注于“你需要什么”,而不是:

一种有趣的方式将使用pasteawkpaste可以使用分隔符“并排”显示2个文件。如果您使用\n作为分隔符,则会显示2个文件,每个文件包含每行的第1行,然后显示每个文件的第2行。

因此,您可以使用的脚本可能很简单(一旦知道有相同数量的在每个文件中的行):

paste -d '\n' /tmp/file1 /tmp/file2 | awk ' 
     NR%2 { linefirstfile=$0 ; } 
     !(NR%2) { if ($0 != linefirstfile) 
         { print "line",NR/2,": "; print linefirstfile ; print $0 ; } }' 

(Interrestingly,该解决方案将允许很容易地扩展做的N个文件一个差异在一个单一的读,无论N个文件的大小是...只是增加一个检查在进行比较步骤之前,所有行都具有相同数量的行(否则“粘贴”将仅显示来自较大文件的行))

这里是一个(短)例如,要显示它是如何工作:

$ cat > /tmp/file1 
A 
C %FORGOT% fmsdflmdflskdf dfldksdlfkdlfkdlkf 
E 

$ cat > /tmp/file2 
A 
C sdflmsdflmsdfsklmdfksdmfksd fmsdflmdflskdf dfldksdlfkdlfkdlkf 
E 

$ paste -d '\n' /tmp/file1 /tmp/file2 
A 
A 
C %FORGOT% fmsdflmdflskdf dfldksdlfkdlfkdlkf 
C sdflmsdflmsdfsklmdfksdmfksd fmsdflmdflskdf dfldksdlfkdlfkdlkf 
E 
E 

$ paste -d '\n' /tmp/file1 /tmp/file2 | awk ' 
    NR%2 { linefirstfile=$0 ; } 
    !(NR%2) { if ($0 != linefirstfile) 
       { print "line",NR/2,": "; print linefirstfile ; print $0 ; } }' 
line 2 : 
C %FORGOT% fmsdflmdflskdf dfldksdlfkdlfkdlkf 
C sdflmsdflmsdfsklmdfksdmfksd fmsdflmdflskdf dfldksdlfkdlfkdlkf 

如果碰巧的文件不具有行相同数量的,那么你可以先添加行号的检查,comparing $(wc -l /tmp/file1)$(wc -l /tmp/file2),只有在过去... | awk中,如果它们具有相同数量的行,以确保“粘贴”通过每行都有一行来正常工作! (但是,当然,在这种情况下,每个文件将会有一个(快速!)完整读取...)

您可以很容易地将其调整为完全按照需要进行调整。你可以在第N个区别后自动退出(或者自动,在awk循环中有一个计数器,或者当你看到足够的时候按下CTRL-C)

+0

太棒了!我把它变成了一个bash脚本,并把它放在我的路径 – arinmorf 2013-05-10 02:02:43

+0

很高兴帮助。你的问题迫使我寻找一种解决方案,我现在也会使用很多解决方案(以有效的方式区分多GB文件的方法是插入)。这是我第一次使用“粘贴”^^ – 2013-05-10 09:24:32

0

你试过了哪些版本的diff? GNU diff有一个“--speed-large-files”可能会有所帮助。

通信工具假定行已排序。

+0

我试过了diff -speed-large-files,但实际上并没有解决内存耗尽的问题。 diff -h也没有。 – arinmorf 2013-05-10 17:42:23