天天看點

【一天一個shell指令】文本操作系列-comm

回到正題:在shell中,也有個這麼個指令---comm。 comm可用于兩個檔案之間的比較。可以用于檔案的比較,交集,求差以及差集操作。

這個定義其實不夠詳細,應該是 comm逐行比較已排序的檔案1和檔案2.

全稱:

(慚愧)沒有找到合适的全稱。 com 很明顯是compare開頭,m為mode。望高手指正。 

檢視—help

用法:comm [選項]... 檔案1 檔案2 

逐行比較已排序的檔案檔案1 和檔案2。

如果不附帶選項,程式會生成三列輸出。第一列包含檔案1 特有的行,第二列包含 檔案2 特有的行,而第三列包含兩個檔案共有的行。

  -1        不輸出檔案1 特有的行 

  -2        不輸出檔案2 特有的行 

  -3        不輸出兩個檔案共有的行

  --check-order            檢查輸入是否被正确排序,即使所有輸入行均成對 

  --nocheck-order        不檢查輸入是否被正确排序 

  --output-delimiter=STR    依照STR 分列

 解讀:

1. --check-order

該指令預設情況下  如果希望不檢驗排序,可以--nocheck-order。

 2. --output-delimiter=STR

 STR 就是個表達式。 可以是任何非特殊字元

3. -1,-2

  可以寫成 -12 與普通指令用起來一樣

  執行個體:

1.建立A.txt

加入元素

apple 

orange 

gold 

silver 

steel 

iron

2. 建立B.txt

cookies 

carrot 

可以嘗試直接比較: comm A.txt B.txt

你會發現提示一個錯誤,沒有排序。 

3. 排序

sort A.txt -o A.txt; sort B.txt -o B.txt 

4. 比較

$comm A.txt B.txt 

apple   

      carrot   

      cookies   

                gold   

iron   

                orange   

silver   

steel  

結果實際為3列 其中第一列是檔案1特有 -1表示删除第一列

第二列是檔案2特有的  -2代表删除第二列

第三列代表共同有的  -3代表删除共有的列

4.1 列印交集:

$comm –12 A.txt B.txt

4.2 列印兩個檔案中不同的行

$comm –3 A.txt B.txt

補充個小修改,兩列不好看,用sed删除行首的\t

$comm –3 A.txt B.txt | sed 's/^\t//'

實戰:

  comm在實戰中,隻會在一些非常特殊的場景中用到。 比較簡單,就不舉例了。(筆者遇到的場景中,仍然堅持有更好的方案時候,不用這個指令,呵呵)。

<a href="http://down.51cto.com/data/2361123" target="_blank">附件:http://down.51cto.com/data/2361123</a>

本文轉自 wws5201985 51CTO部落格,原文連結:http://blog.51cto.com/yjplxq/948349,如需轉載請自行聯系原作者

繼續閱讀