Journey of a noob

Learn From Noobs

以例子簡介 ‘comm’ 指令

Posted at # Unix/Linux

以例子簡介 ‘comm’ 指令

comm 是一個用作逐行比較兩個已排序檔案的指令,我們可以在多種情況下使用它,在討論實用例子前,讓我們先了解一下它是如何運作的。


‘comm’ 指令是如何運作的

在沒有提供選項執行時

讓我們用例子看看 comm 指令是如何運作的,在以下例子中,我們需要創建兩個檔案:

file1.txt

Apple
Banana
Cat

file2.txt

Banana
Whatever

我們可以把這兩個檔案作為指令的引數 (argument),並且不提供選項地執行這指令,看看 comm 會給我們怎樣的輸出。

noob@learnfromnoobs:~$ comm file1.txt file2.txt
Apple
                Banana
Cat
        Whatever

這結果看上來有點奇怪…… 到底這個輸出在表達甚麼呢?其實,如果在執行 comm 指令時不附帶任何選項,指令就會生成三列輸出。

所以其實指令提供了一個類似以下表格的輸出:

列 1
文件1 特有的行
列 2
文件2 特有的行
列 3
兩個文件共有的行
Apple
Banana
Cat
Whatever

不輸出某列

我們可以使用選項 -1-2-3comm 指令不輸出相應的列。

讓我們嘗試不輸出第三列吧。

noob@learnfromnoobs:~$ comm -3 file1.txt file2.txt
Apple
Cat
        Whatever

如果你仍然無法理解上述輸出,這個更新了的表格可能會幫到你,表格中的第三列被刪除了,因為我們使用了選項 -3

列 1
文件1 特有的行
列 2
文件2 特有的行
列 3
兩個文件共有的行
Apple-
-
Cat-
Whatever-

常見實用例子

懂得巧妙利用 -1-2-3 不同的組合的話,comm 指令會變得更有用,以下就是一些常見的實用例子。

1. 顯示檔案1 的內容,若這些內容亦存在於檔案2 中則不會被顯示

假設我們有兩個檔案: 檔案1 和檔案2,我們想在檔案1 中刪除任何存在於檔案2 中的行,我們可以使用 comm -23 令指令只輸出檔案1 特有的行,其他的行(檔案2 特有的行以及兩個檔案共有的行)則不會被輸出。

noob@learnfromnoobs:~$ comm -23 file1.txt file2.txt
Apple
Cat

如果你對這課題感興趣,你可以查看這篇文章了解其他可行的方法。

2. 顯示兩個文件共有的行

我們可以使用 comm -12 令指令只顯示兩個文件共有的行。

noob@learnfromnoobs:~$ comm -12 file1.txt file2.txt
Banana

3. 比較兩個指令的結果

有了 Process Substitution(進程替代)的幫忙,我們可以使用 comm 指今來比較兩個指令的結果。

例如,我們可以比較在兩個 directory(目錄)下 ls 指令輸出的差別,我們可以使用 comm -23 令指令顯示只在 dir1 存在而不存在於 dir2 中的檔案。

$ comm -23 <(ls dir1) <(ls dir2)

總結

在這篇文章中,我們討論了 comm 指令是如何運作的,我們亦探討了幾個 comm 指令的常見實用例子,你剛剛在你的工具箱中添加了 comm 指令這新工具,在合適的情況下使用它確實可以幫助你節省時間和功夫。

我希望你喜歡這篇文章,並從中得到了新知識。

記得要不斷學習,have fun!