首页/系统/Linux 运维命令速查/join 按键连接两个文件
文本处理77 条

join 按键连接两个文件

类 SQL JOIN:按共同字段把两个有序文件拼成宽表;-t 指定分隔符、-a 保留未匹配行,统计报表拼接常客。

Linux 运维命令速查系统更新于 2026-10-13

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 只适合规整的分隔文本。

易错点

  • 忘记排序:join 静默漏匹配,输出看着正常但结果不全,先核对输入是否有序再怀疑数据
  • CSV 不加 -t,:默认按空白切列,含逗号的字段被当成整体,连接结果完全错位
  • 用 -a1 却不用 -e 填充:未匹配行的右半部分为空列,后续统计容易把空值当 0 处理
  • 字段内含逗号或引号的 CSV 直接交给 join:它不做引号处理,列会切错且不报错

数据来源与参考

  • man 1 join(GNU coreutils 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌