我有时需要比较两个文本文件。显然,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
答案 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