join 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,属于文本处理命令族(见文本处理命令族)。它是命令行里的"数据库 join"。
join 把两个文件里关联字段相同的行拼到一起,类似 SQL 的 inner join。前提是两文件都按关联字段排好序。
一、基本用法
bash
join a.txt b.txt # 默认按每行的第 1 个字段关联
# a.txt: 1 alice
# b.txt: 1 engineer
# 输出: 1 alice engineer默认用第 1 列作 key,输出"key + a 的剩余字段 + b 的剩余字段"。两个文件都必须先按 key 排序,否则 join 会漏行(它是一路归并,乱序就错过)。
二、指定关联列:-1 / -2
bash
join -1 2 -2 1 a.txt b.txt # a 用第2列、b 用第1列作 key两边 key 不在同一列时用
-1(文件1的列)和-2(文件2的列)指定。比如 a 是name,id、b 是id,score,就join -1 2 -2 1。
三、分隔符与未匹配行
bash
join -t: a.txt b.txt # -t 指定字段分隔符(如 :)
join -a1 a.txt b.txt # -a1 保留文件1中没匹配上的行(left join)
join -v2 b.txt a.txt # -v2 只输出文件2中未匹配的
-t设分隔符(默认空白)。-a1/-a2是 left/right join(保留未匹配),-v是"只输出未匹配的"(类似 anti-join)。默认是 inner join,丢两边没匹配的。
四、与 paste 的区别
bash
paste a b # 按行号机械并排,不管内容(见 [paste](/linux/cmd/paste.md))
join a b # 按 key 关联,内容要对得上paste 是"盲并排"(行号对齐),
join是"按 key 关联"(语义对齐)。要关联两张表用 join,只是并排展示用 paste。
一句话总结
join = 按字段关联两文件(类 SQL inner join):默认按第 1 列 key,两文件必须先排序否则漏行;-1/-2 指定各自 key 列、-t 设分隔符;-a1/-a2 是 left/right join、-v 只输未匹配;与 paste(见paste)区别是 join 按 key 关联、paste 按行号盲并排。