Linux join 命令超全详解:文本文件关联合并神器,数据处理必备
📅 2026/7/7 3:09:09
👁️ 阅读次数
📝 编程学习
1. 命令简介
join 命令用于将两个文件中指定栏位(字段)内容相同的行连接(合并)起来。它基于两个输入文件中指定的关键字段(默认为第一个字段)进行匹配,将匹配成功的行按指定格式合并后输出到标准输出。
该命令常用于处理具有关联关系的结构化文本数据(如 CSV、TSV 或空格分隔的文件),是 Linux/Unix 系统中进行数据关联操作的常用工具。
2. 语法格式
plaintext
join [选项]... 文件1 文件2基本要求:
- 输入的两个文件必须已按照连接字段(关键字段)排序(通常使用 sort 命令预处理)。
- 默认情况下,join 使用两个文件的第一个字段作为连接键,并以空白字符(空格、制表符)作为字段分隔符。
- 如果 文件 1 或 文件 2 是 -,则表示从标准输入读取。
3. 常用选项及说明
表格
| 选项 | 说明 |
|---|---|
| -a FILENUM | 除了显示正常连接的行外,还输出指定文件中未能匹配的行。FILENUM 为 1 或 2,分别对应 文件 1 或 文件 2。 |
| -e STRING | 当某个文件在匹配行中缺少输出字段时,用指定的 STRING 填充空字段。 |
| -i 或 --ignore-case | 在比较连接字段时,忽略大小写差异。 |
| -j FIELD | 等价于 -1 FIELD -2 FIELD,指定两个文件共同使用的连接字段编号。 |
| -o FORMAT | 自定义输出格式。FORMAT 格式为 FILENUM.FIELD,例如 1.2 表示输出第一个文件的第 2 个字段,2.3 表示输出第二个文件的第 3 个字段。多个字段用逗号或空格分隔。 |
| -t CHAR | 指定输入和输出字段分隔符为单个字符 CHAR(例如 -t ',' 用于 CSV 文件)。默认是空白字符。 |
| -v FILENUM | 与 -a 类似,但只输出指定文件中未能匹配的行,不输出成功连接的行。 |
| -1 FIELD | 指定 文件 1 中用于连接的字段编号,从 1 开始计数。 |
| -2 FIELD | 指定 文件 2 中用于连接的字段编号,从 1 开始计数。 |
| --help | 显示帮助信息并退出。 |
| --version | 显示版本信息并退出。 |
4. 示例用法
假设我们有两个已排序的文件:
employees.txt (员工 ID 和姓名)
plaintext
101 Alice 102 Bob 103 Charlie 105 Evedepartments.txt (员工 ID 和部门)
plaintext
101 Engineering 102 Sales 104 Marketing 105 HR示例 1:基本内连接(默认)
输出两个文件中员工 ID 匹配的行。
命令:
bash
运行
join employees.txt departments.txt输出:
plaintext
101 Alice Engineering 102 Bob Sales 105 Eve HR(注意:ID 为 103 和 104 的员工因在另一文件中无匹配项,未被输出)
示例 2:左外连接 (-a 1)
输出所有 employees.txt 中的行,即使其在 departments.txt 中没有匹配项。
命令:
bash
运行
join -a 1 employees.txt departments.txt输出:
plaintext
101 Alice Engineering 102 Bob Sales 103 Charlie 105 Eve HR示例 3:仅显示未匹配的行 (-v)
仅显示在 employees.txt 中存在但在 departments.txt 中无匹配的行。
命令:
bash
运行
join -v 1 employees.txt departments.txt输出:
plaintext
103 Charlie示例 4:自定义连接字段和分隔符
假设文件以逗号分隔,且需用 文件 1 的第 2 字段连接 文件 2 的第 1 字段。
命令:
bash
运行
join -t ',' -1 2 -2 1 file1.csv file2.csv示例 5:自定义输出格式 (-o)
仅输出员工姓名(文件 1 第 2 字段)和部门(文件 2 第 2 字段)。
命令:
bash
运行
join -o 1.2,2.2 employees.txt departments.txt输出:
plaintext
Alice Engineering Bob Sales Eve HR示例 6:处理缺失字段 (-e)
当某个匹配行在第二个文件中字段数不足时,用 “N/A” 填充。
命令:
bash
运行
join -e ‘N/A‘ -a 1 employees.txt departments_short.txt5. 注意事项
- 排序要求:这是最重要的一点。join 命令要求两个输入文件必须已按照连接键严格排序(通常为字典序)。如果文件未排序,结果将不可预测或报错。务必先使用 sort 命令对连接字段进行排序。
plaintext
join <(sort file1) <(sort file2)- 字段分隔符:默认字段分隔符是空白字符(空格 / 制表符),会忽略行首的空白并将连续的空白视为一个分隔符。若需精确控制,应使用 -t 选项指定单一字符作为分隔符。
- 连接键唯一性:如果某个文件中有多行的连接键值相同,join 会生成所有可能的配对组合,这可能导致输出行数激增。
- 文件格式:两个文件的字段分隔符应保持一致。如果使用 -t 指定了分隔符,它将同时应用于输入和输出。
- 字段编号:字段编号从 1 开始,而不是 0。
- 性能:对于非常大的文件,join 可能比某些数据库操作或高级编程语言处理慢,但对于系统脚本和日常文本处理任务,它非常高效便捷。
获取更多Linux学习资料请关注“阿成学长工具包”,对话框中输入2647获取
编程学习
技术分享
实战经验