2013-04-30 28 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