* nix:执行set union / intersection / lists of lists

时间:2011-12-15 12:56:45

标签: perl bash unix text diff

我有时需要比较两个文本文件。显然,diff显示了差异,它也隐藏了相似之处,这就是重点。

假设我想对这些文件进行其他比较:set union,intersection和subtraction,将每一行视为集合中的元素。

是否有类似简单的常用工具或单行工具可以做到这一点?


示例:

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

4 个答案:

答案 0 :(得分:19)

Union:sort -u 个文件......

交叉点:sort 个文件... | uniq -d

差异:sort 个文件...... | uniq -u

答案 1 :(得分:7)

如果您想获得两个文件之间的公共线,可以使用comm实用程序。

A.txt:

A
B
C

B.txt

A
B
D

然后,使用comm会给你:

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

在第一列中,您拥有第一个文件中的内容,而不是第二个文件中的内容。

在第二列中,您拥有第二个文件中的内容,而不是第一个文件中的内容。

在第三列中,您拥有两个文件中的内容。

答案 2 :(得分: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($_);
}

答案 3 :(得分:0)

我无法评论Aaron Digulla的回答,尽管被接受但实际上并未计算set difference

具有给定输入的设置差异A \ B应仅返回mary,但接受的答案也会错误地返回adam

This answer有一个awk单行,正确计算集合差异:

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