我不會用comm
,但正如你所說,你需要什麼,除了你怎麼認爲你應該這樣做,我會專注於「你需要什麼」,而不是:
一種有趣的方式將使用paste
和awk
:paste
可以使用分隔符「並排」顯示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)
太棒了!我把它變成了一個bash腳本,並把它放在我的路徑 – arinmorf 2013-05-10 02:02:43
很高興幫助。你的問題迫使我尋找一種解決方案,我現在也會使用很多解決方案(以有效的方式區分多GB文件的方法是插入)。這是我第一次使用「粘貼」^^ – 2013-05-10 09:24:32