2011-12-15 45 views
12

我有時需要比較兩個文本文件。顯然,diff顯示的差異,它也隱藏了相似之處,這是點。* nix:執行列表聯合/交集/列表差

假設我想對這些文件進行其他比較:設置聯合,交集和減法,將每行視爲集合中的一個元素。

是否有類似的簡單的普通工具或單行可以做到這一點?


實例:

A.TXT

john 
mary 

b.txt

adam 
john 

$> set_union a.txt b.txt 
john 
mary 
adam 

$> set_intersection a.txt b.txt 
john 

$> set_difference a.txt b.txt 
mary 
+0

你能給你的意思是「聯盟」在這裏什麼的例子嗎? – fge 2011-12-15 12:58:46

回答

19

聯盟:sort -u文件...

交叉路口:sort文件...| uniq -d

差異:sort文件...| uniq -u

7

如果你想獲得兩個文件之間的公共線,您可以使用comm實用。

A.TXT:

A 
B 
C 

B.txt

A 
B 
D 

,然後使用通訊會給你:

$ comm <(sort A.txt) <(sort B.txt) 
     A 
     B 
C 
    D 

在第一列中,你有什麼在第一個文件中,而不是在第二個文件中。

在第二列中,您有第二個文件中的內容,而不是第一個文件中的內容。

在第三列中,您有兩個文件中的內容。

0

如果你不這樣做介意使用一點Perl,如果你的文件大小合理,可以寫入散列,你可以收集文件分爲兩個哈希做:

#...get common keys in an array... 
my @both_things 
for (keys %from_1) { 
    push @both_things, $_ if exists $from_2{$_}; 
} 

#...put unique things in an array... 
my @once_only 
for (keys %from_1) { 
    push @once_only, $_ unless exists $from_2($_); 
} 
0

我不能在亞倫Digulla的答案,這儘管是公認的實際上不計算set difference評論。

給定輸入的設置差異A \ B應只返回mary,但接受的答案也錯誤地返回adam

This answer有一個awk的一行是正確計算差集:

awk 'FNR==NR {a[$0]++; next} !a[$0]' b.txt a.txt