join 是命令行版的表连接
join 按公共字段把两个文件拼成一张宽表:默认按第 1 字段、以空白分隔做内连接,-t 指定分隔符、-a1/-a2 保留未匹配行实现外连接、-o 自选输出列。处理 CSV 报表拼接、名单与明细对照时很省事。硬前提是两个文件都按连接键排序:顺序不对时它不会报错,只会静默漏掉匹配结果。
基本信息
| 适用平台 | Linux 与类 Unix(GNU coreutils) |
|---|---|
| 语法 | join [选项] 文件1 文件2 |
| 默认行为 | 第 1 字段为连接键、空白分隔、内连接、输出用空格分隔 |
| 常用选项 | -t 分隔符、-1/-2 指定连接键、-a 外连接、-v 只看未匹配、-o 输出列、-e 填充 |
| 排序要求 | 两个文件都必须按连接键排序(先 sort -t, -k1,1) |
典型使用场景
- 用户名单与订单明细拼成宽表做统计
- 主机清单与监控数据对照,找出未被采集的机器
- 配置表与资产表核对,定位漏配或多余项
- 日志按 IP 聚合后与资产库连接,补全归属信息
- CSV 报表二次加工(先排序再连接)
常用示例
常用示例
sort -t, -k1,1 users.csv -o users.csv # 连接前先保证按连接键有序
sort -t, -k1,1 orders.csv -o orders.csv
join -t, users.csv orders.csv # 按第 1 列做内连接
join -t, -1 1 -2 2 users.csv orders.csv # 两侧分别指定连接键
join -t, -a1 users.csv orders.csv # 左连接:保留没有订单的用户
join -t, -a1 -e '无' -o 1.1,1.2,2.3 users.csv orders.csv # 自选输出列并填充空值
join -t, -v1 users.csv orders.csv # 只输出未匹配行,用于找“没有订单”的用户
join -t, -a1 -a2 users.csv orders.csv # 全外连接:两侧未匹配的行都保留选项读法
| 选项 | 作用 | 注意 |
|---|---|---|
| 默认 | 第 1 字段连接、空白分隔、内连接 | 处理 CSV 必须显式 -t, |
| -1 N / -2 M | 分别指定两个文件的连接键位置 | 连接键不在第 1 列时必用 |
| -a1 / -a2 | 保留左/右未匹配行(外连接) | 只看未匹配行用 -v1 / -v2 |
| -o 列格式 | 自选输出列,如 1.1,2.3 | 列多时比事后 cut 更清晰 |
| -e 字符串 | 为缺失字段填充内容 | 避免输出里空列难以判断 |
| sort 预处理 | sort -t, -k1,1 文件 -o 文件 | 不排序会静默漏匹配 |
两个文件都必须按连接键排序,且排序规则要一致(含大小写与本地化设置)。顺序不对时 join 不报错只是漏匹配,很容易被误当成数据本身缺失。
join 不做引号转义:字段内含逗号或引号的 CSV 会被切错列。这类数据应交给 awk、csvkit、miller 或数据库处理,join 只适合规整的分隔文本。