2011-12-15 71 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