萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux 檔案比較指令 comm 與 grep 差集操作完整教學

comm:已排序檔案的集合運算

前提條件

兩個檔案必須經過排序(sort file1 > file1.sorted),否則輸出錯誤。

語法與三欄輸出

comm [-123] file1 file2
# 第 1 欄:僅在 file1 出現的行
# 第 2 欄:僅在 file2 出現的行
# 第 3 欄:兩檔案共有的行

抑制欄位選項

選項效果等效輸出
-1隱藏第 1 欄僅顯示 file2 獨有 + 共同
-2隱藏第 2 欄僅顯示 file1 獨有 + 共同
-3隱藏第 3 欄僅顯示 file1 獨有 + file2 獨有(對稱差集)
-12隱藏 1、2 欄僅顯示交集(共同行)
-13隱藏 1、3 欄僅顯示 file2 獨有(差集 file2 - file1)
-23隱藏 2、3 欄僅顯示 file1 獨有(差集 file1 - file2)
-123隱藏所有無輸出

實戰範例

# 找出兩檔案共同的行
comm -12 file1.sorted file2.sorted

# 找出只在 file1 有的行
comm -23 file1.sorted file2.sorted

# 找出只在 file2 有的行
comm -13 file1.sorted file2.sorted

grep -f:未排序檔案的模式過濾

語法

grep -v -f file1 file2
# -f file1:從 file1 讀取模式(每行一個模式)
# -v:反向匹配(顯示不匹配的行)
# 效果:輸出 file2 中「不包含 file1 任何行作為子字串」的行

關鍵差異

特性commgrep -f
需排序是否
匹配方式整行精確比對子字串/正則比對
效能(大檔)O(n log n) 排序 + O(n) 合併O(m*n) 暴力匹配,極慢
輸出格式三欄制表分隔原始行

進階替代方案

join:關係式連接(需排序)

# 內連接(交集)
join file1.sorted file2.sorted

# 左外連接
join -a 1 file1.sorted file2.sorted

awk:高效差集(無需排序、記憶體允許時)

# file1 獨有
awk 'NR==FNR{a[$0];next} !($0 in a)' file2 file1

# file2 獨有
awk 'NR==FNR{a[$0];next} !($0 in a)' file1 file2

# 交集
awk 'NR==FNR{a[$0];next} ($0 in a)' file1 file2

sort + uniq:經典管線

# 交集
sort file1 file2 | uniq -d

# 對稱差集(只出現一次的行)
sort file1 file2 | uniq -u

# file1 - file2
sort file1 file2 file2 | uniq -u

選型建議

  • 檔案已排序、需整行精確比對、追求高效能 → comm
  • 檔案未排序、較小(< 10 萬行)、需子字串/正則匹配 → grep -f
  • 檔案大、未排序、有足夠記憶體 → awk 雜湊表法
  • 需關係式連接(按欄位比對) → join
  • 一次性快速分析 → sort | uniq

理解各工具的演算法複雜度與適用邊界,能讓大檔案比對從「跑半天」變成「秒出結果」。

copyright © 萬盛學電腦網 all rights reserved