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。