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 – 兩個文件共有的行
所以其實指令提供了一個類似以下表格的輸出:
列 1 文件1 特有的行 | 列 2 文件2 特有的行 | 列 3 兩個文件共有的行 |
---|---|---|
Apple | ||
Banana | ||
Cat | ||
Whatever |
不輸出某列
我們可以使用選項 -1
、-2
和 -3
令 comm
指令不輸出相應的列。
讓我們嘗試不輸出第三列吧。
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!