1. 程式人生 > >兩個文件比較之comm命令

兩個文件比較之comm命令

div shell 比較 輸入 操作 shel spa 文件中 差集

comm命令可用於兩個文件之間的比較。它有很多不錯的選項可用來調整輸出,以便我們執
行交集、求差(difference)以及差集操作。
? 交集:打印出兩個文件所共有的行。
? 求差:打印出指定文件所包含的且互不相同的那些行。
? 差集:打印出包含在文件a中,但不包含在其他指定文件中的那些行。

假設現在有兩個文件a和b,內容分別是:a(1,2,3),b(3,4,5)。那麽,對這兩個文件進行操作的結果如下。
交集:3。
求差:1,2,4,5。
差集(a):1,2。

需要註意的是comm必須使用排過序的文件作為輸入。請看看下面的例子:

[[email protected] shell]# echo
-e "1\n3\n8\n2" > a.txt [[email protected] shell]# cat a.txt 1 3 8 2 [[email protected] shell]# echo -e "1\n5\n7\n2" > b.txt [[email protected] shell]# cat b.txt 1 5 7 2 [[email protected] shell]# sort a.txt -o a.txt ; sort b.txt -o b.txt

(1) 首先執行不帶任何選項的comm:

[[email protected] shell]# comm a.txt b.txt 
        1
        2
3
    5
    7
8

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

(2) 為了打印兩個文件的交集,我們需要刪除第一列和第二列,只打印出第三列:

[[email protected] shell]# comm -1 -2 a.txt b.txt 
1
2

(3) 打印出兩個文件中不相同的行:

[[email protected] shell]# comm -3 a.txt b.txt 
3
    5
    7
8

在這次的輸出中,那些唯一出現的行使得列中出現了空白字段。所以這兩列在同一
行上不會同時都出現內容。為了提高輸出結果的可用性,需要刪除空白字段,將兩
列合並成一列:

3
5
7
8

(4) 要生成規範的輸出,得使用下面的命令:

[[email protected] shell]# comm -3 a.txt b.txt | sed s/^\t//
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的輸出。它刪除行首的 \t字符。sed中的s
表示替換(substitute)。/^\t/ 匹配行前的 \t(^是行首標記)。//(兩個/操作符之間沒有任何
字符)是用來替換行首的\t的字符串。如此一來,就刪除了所有行首的\t。
  差集操作允許你比較兩個文件,打印出只在a.txt或b.txt中出現的行。當a.txt和b.txt作為comm
命令的參數時,輸出中的第一列是a.txt相對於b.txt的差集,第二列是b.txt相對於a.txt的差集。

兩個文件比較之comm命令