2009-04-14 60 views
137

我有一系列的文本文件,我想知道它們之間不同的線條,而不是它們之間的線條。命令行unix或windows很好。如何顯示共同的行(反向差異)?

富:

linux-vdso.so.1 => (0x00007fffccffe000) 
libvlc.so.2 => /usr/lib/libvlc.so.2 (0x00007f0dc4b0b000) 
libvlccore.so.0 => /usr/lib/libvlccore.so.0 (0x00007f0dc483f000) 
libc.so.6 => /lib/libc.so.6 (0x00007f0dc44cd000) 

條:

libkdeui.so.5 => /usr/lib/libkdeui.so.5 (0x00007f716ae22000) 
libkio.so.5 => /usr/lib/libkio.so.5 (0x00007f716a96d000) 
linux-vdso.so.1 => (0x00007fffccffe000) 

因此,考慮到所需的實用程序的輸出上面這兩個文件將類似於file1:line_number, file2:line_number == matching text(只是一個建議,我真的不知道注意語法是什麼):

foo:1, bar:3 == linux-vdso.so.1 => (0x00007fffccffe000) 

謝謝。

+0

@ChristopherSchultz我的錯誤。第一個例子中的第一行假設匹配第二個例子中的最後一行。感謝您抓住錯誤;改變。 – 2015-07-22 17:25:00

+1

另一個類似的問題有很好的答案:http://unix.stackexchange.com/questions/1079/output-the-common-lines-similarities-of-two-text-files-the-opposite-of-diff – MortezaE 2015-09-25 08:58:41

回答

169

在* nix上,您可以使用comm。該問題的答案是:

comm -1 -2 file1.sorted file2.sorted 
# where file1 and file2 are sorted and piped into *.sorted 

這裏是comm完整的用法:

comm [-1] [-2] [-3 ] file1 file2 
-1 Suppress the output column of lines unique to file1. 
-2 Suppress the output column of lines unique to file2. 
-3 Suppress the output column of lines duplicated in file1 and file2. 

還要注意,使用COMM之前對文件進行排序很重要,因爲在手冊頁提及。

+1

comm [ -1] [-2] [-3]文件1文件2 -1禁止file1唯一的行的輸出列。 -2禁止file2的唯一行的輸出列。 -3禁止在file1和file2中複製的行的輸出列。 – ojblass 2009-04-14 05:43:50

+0

@ojblass:將此添加到答案中。 – 2009-04-14 07:15:48

+3

我發現在使用comm之前重要的是文件被排序。也許再加上這個答案。 – 2009-04-21 16:14:59

11

我剛剛得知從這個線程的通訊命令,但想增加一些額外的東西:如果文件沒有排序,並且您不想觸摸原始文件,您可以管理排序命令的輸出。這使原始文件保持不變。在bash中工作,我不能說其他的炮彈。

comm -1 -2 <(sort file1) <(sort file2) 

這可以擴展到比較命令的輸出,而不是文件:

comm -1 -2 <(ls /dir1 | sort) <(ls /dir2 | sort) 
35

上找到a question listed as a duplicate這個答案。我覺得grep的更加管理員友好比COMM,所以如果你只是想組匹配行(用於比較的CSV,比如有用)簡單地用

grep -F -x -f file1 file2 

或精簡fgrep一樣版本

fgrep -xf file1 file2 

另外,您可以使用file2*來查找與多個文件相同的行,而不僅僅是兩行。

一些其他方便的變型包括

  • -n標誌顯示行號每一個匹配線的
  • -c只計算匹配
  • -v在僅顯示線該行數文件2不同(或使用diff)。

使用comm會更快,但是速度的提高必須先排序文件。它作爲'反向差異'並不是非常有用。

1

只是爲了信息,我犯了一個小工具,爲Windows做多的「grep -F -x -f文件1文件2」同樣的事情(因爲我沒有發現任何東西相當於Windows此命令)

那就是: http://www.nerdzcore.com/?page=commonlines

用法是 「CommonLines inputFile1 inputFile2 OUTPUTFILE」

源代碼也可以(GPL)

5

做的最簡單方法是:

awk 'NR==FNR{a[$1]++;next} a[$1] ' file1 file2 

無需對文件進行排序。