我不会用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