两个文件比较之comm命令

comm命令可用于两个文件之间的比较。它有很多不错的选项可用来调整输出,以便我们执
行交集、求差(difference)以及差集操作。
 交集:打印出两个文件所共有的行。
 求差:打印出指定文件所包含的且互不相同的那些行。
 差集:打印出包含在文件a中,但不包含在其他指定文件中的那些行。

假设现在有两个文件a和b,内容分别是:a(1,2,3),b(3,4,5)。那么,对这两个文件进行操作的结果如下。
交集:3。
求差:1,2,4,5。
差集(a):1,2。

需要注意的是comm必须使用排过序的文件作为输入。请看看下面的例子:

[root@host1 shell]# echo -e "1
3
8
2" > a.txt
[root@host1 shell]# cat a.txt 
1
3
8
2
[root@host1 shell]# echo -e "1
5
7
2" > b.txt
[root@host1 shell]# cat b.txt 
1
5
7
2
[root@host1 shell]# sort a.txt  -o a.txt ; sort b.txt -o b.txt

(1) 首先执行不带任何选项的comm:

[root@host1 shell]# comm a.txt b.txt 
        1
        2
3
    5
    7
8

输出的第一列包含只在a.txt中出现的行(a的差集),第二列包含只在b.txt中出现的行(b的差集),第三列
包含a.txt和b.txt中相同的行(交集)。各列以制表符( )作为定界符。

(2) 为了打印两个文件的交集,我们需要删除第一列和第二列,只打印出第三列:

[root@host1 shell]# comm -1 -2 a.txt b.txt 
1
2

(3) 打印出两个文件中不相同的行:

[root@host1 shell]# comm -3 a.txt b.txt 
3
    5
    7
8

在这次的输出中,那些唯一出现的行使得列中出现了空白字段。所以这两列在同一
行上不会同时都出现内容。为了提高输出结果的可用性,需要删除空白字段,将两
列合并成一列:

3
5
7
8

(4) 要生成规范的输出,得使用下面的命令:

[root@host1 shell]# comm -3 a.txt b.txt | sed 's/^	//'
3
5
7
8

(5) 通过删除不需要的列,我们就可以分别得到a.txt和b.txt的差集。
a.txt的差集
$ comm a.txt b.txt -2 -3
-2 -3 删除第二列和第三列。
b.txt的差集
$ comm a.txt b.txt -1 -3
-1 -3 删除第一列和第三列。

工作原理:

comm的命令行选项可以按照需求对输出进行格式化,例如:
 -1 从输出中删除第一列;
 -2 从输出中删除第二列;
 -3 从输出中删除第三列。
  在生成统一输出时,sed命令通过管道获取comm的输出。它删除行首的 字符。sed中的s
表示替换(substitute)。/^ / 匹配行前的 (^是行首标记)。//(两个/操作符之间没有任何
字符)是用来替换行首的 的字符串。如此一来,就删除了所有行首的 。
  差集操作允许你比较两个文件,打印出只在a.txt或b.txt中出现的行。当a.txt和b.txt作为comm
命令的参数时,输出中的第一列是a.txt相对于b.txt的差集,第二列是b.txt相对于a.txt的差集。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注