Linux比较文本文件的交集、差集与求差

 

介绍两个常用命令:

1. comm命令

comm命令可以用于两个文件之间的比较,它有一些选项可以用来调整输出,以便执行交集、求差、以及差集操作。有三列内容:分别表示A-B,B-A 和 A交B。

相关集合论解释:
交集:打印出两个文件所共有的行。
求差:打印出指定文件所包含的且不相同的行。
差集:打印出包含在一个文件中,但不包含在其他指定文件中的行。

实例:

输出的第一列只包含在aaa.txt中出现的行,第二列包含在bbb.txt中出现的行,第三列包含在aaa.txt和bbb.txt中相同的行。各列是以制表符(\t)作为定界符。

格式化输出选项:
-1:从输出中删除第一列
-2:从输出中删除第二列
-3:从输出中删除第三列

1.1 交集

打印两个文件的交集,需要删除第一列和第二列:

1.2 求差

打印出两个文件中不相同的行,需要删除第三列:

sed ‘s/^\t//’ 是将制表符(\t)删除,以便把两列合并成一列。

1.3 差集

通过删除不需要的列,可以得到aaa.txt和bbb.txt的差集:

1.3.1 aaa.txt的差集

1.3.2 bbb.txt的差集

注意1:
1. comm命令要求输入文件的内容必须是排序且唯一的
2. comm -12 表示取消第一列和第二列的输出,即只输出第三列。

2. grep命令

grep命令是常用来搜索文本内容的,根据输入的pattern,输出命中的内容。可以利用它的文件输入pattern特性,来求两个文件的交集。

2.1 交集

2.2 差集

2.2.1 aaa.txt – bbb.txt的差集

2.2.2 bbb.txt  – aaa.txt的差集

注意2:
1. grep求交集不要求输入文件是排序的,但最好是唯一的
2. 差集时注意输入文件的顺序

大家可能注意到了,comm与grep求差集的结果却不同,当我们在使用comm命令前,先对aaa.txt和bbb.txt进行排序操作后,再比较。结果如下:

这结果才与grep的结果相同。

需要注意的是,这两上命令对中文的处理有些问题。

摘自:http://www.ttlsa.com/linux/linux-file-comparison-operations-text-file-of-the-intersection-difference-sets-and-difference/

《Linux比较文本文件的交集、差集与求差》有1个想法

发表评论

电子邮件地址不会被公开。