join — 依共同欄位合併兩個已排序的檔案

依共同欄位合併兩個已排序的文字檔(類似 SQL JOIN)。

語法

join [選項] 檔案1 檔案2

常用選項

選項 說明 範例
-1 N 指定檔案1的連接欄位(預設第 1 欄) join -1 2 file1 file2
-2 N 指定檔案2的連接欄位(預設第 1 欄) join -2 3 file1 file2
-t 分隔符 指定欄位分隔符(預設空白) join -t: file1 file2
-a N 除匹配行外,也輸出檔案 N 中無法匹配的行(LEFT JOIN) join -a 1 file1 file2
-v N 只輸出檔案 N 中無法匹配的行 join -v 1 file1 file2
-i 忽略大小寫比較 join -i file1 file2
-o 格式 指定輸出欄位(如 1.1,2.2,1.2) join -o 1.1,2.2 file1 file2

使用範例

範例 1:合併兩個有共同 ID 的檔案

假設 users.txt 有 ID 和姓名,scores.txt 有 ID 和分數,依 ID 合併:

$ # users.txt: 1 Alice / 2 Bob / 3 Charlie
# scores.txt: 1 95 / 2 87 / 4 72
sort -k1 users.txt > u.s && sort -k1 scores.txt > s.s
join u.s s.s
1 Alice 95
2 Bob 87
範例 2:LEFT JOIN(包含未匹配的行)

使用 -a 1 輸出檔案1中所有行,包含在檔案2中沒有對應的行。

$ join -a 1 users.sorted scores.sorted
1 Alice 95
2 Bob 87
3 Charlie
範例 3:以冒號分隔合併 /etc/passwd 欄位

合併 passwd 和 shadow 的共同使用者名稱欄位。

$ join -t: -1 1 -2 1 <(sort /etc/passwd) <(sudo sort /etc/shadow) | cut -d: -f1,2
root:$6$...

常見錯誤與排錯

join: file 1 is not sorted
原因
輸入檔案未依連接欄位排序,join 要求輸入必須已排序。
解法
先用 sort -k1 file > sorted_file,再進行 join。

延伸閱讀