Linux join 命令 - 基于共同字段合并文件
join 命令是 Linux / Unix / FreeBSD 系统中的一个基于共同字段合并两个文件的工具。它指定共同字段,默认使用第一列,将不同文件的数据关联起来,且可以指定输出格式,功能非常的强大,适合处理结构化的文本数据(如 CSV / TSV)。
[!NTOE]
join属于 GNU coreutils 基础套件,通常预装在系统中。
join 命令基本语法结构
join [选项] 文件1 文件2
语法结构解释:
文件1:第一个输入文件,需要已按连接字段排序文件2:第二个输入文件,需要已按连接字段排序[选项]:用于控制连接行为的参数
join 命令使用示例
基于默认第一列文件合并
两个示例文件的基本内容:
1001 张三
1002 李四
1001 三年级
1002 四年级
不使用任何选项就默认使用第一列合并两个文件:
join name.txt class.txt
示例输出结果为:
1001 张三 三年级
1002 李四 四年级
指定连接字段
两个示例文件的基本内容:
张三 1001
李四 1002
三年级 98 1001
四年级 99 1002
使用 -1 指定第一个文件中作为连接字段的列,-2 指定第二个文件中作为连接字段的列:
join -1 2 -2 3 name.txt class.txt
示例输出结果为:
1001 张三 三年级 98
1002 李四 四年级 99
自定义分隔符
使用 -t 选项指定文件内容列之间使用的分隔符:
join -t ':' name.txt class.txt
忽略内容大小写
使用 -i 选项忽略连接字段列之间的大小写区别:
join -i name.txt class.txt
join 命令选项详解
如下给出 join 命令选项的详细解释说明。
基础连接控制选项
如下给出 join 命令的选项中用于基础连接控制选项的详细解释说明:
| 选项 | 作用 | 示例 |
|---|---|---|
-a FILENUM | 保留指定文件中无法匹配的行,FILENUM 的取值 1=文件1,2=文件2默认只输出能匹配的行 | join -a 1 file1 file2输出匹配行 + 文件1 中未匹配的行 |
-v FILENUM | 只输出指定文件中无法匹配的行 | join -v 2 file1 file2只输出 文件2 中未匹配的行 |
-i, --ignore-case | 匹配字段时忽略大小写 | join -i file1 file2例如:匹配把 "Apple" 和 "apple" 做为同一字段 |
-j FIELD | 等价于 -1 FIELD -2 FIELD,FIELD 为字段编号,同时指定两个文件的连接字段的编号 | join -j 2 file1 file2按两个文件的第 2 个字段进行连接 |
-1 FIELD | 指定 文件1 的连接字段,FIELD 为字段编号,从 1 开始 | join -1 3 -2 1 file1 file2文件 1 按第 3 字段、文件 2 按第 1 字段连接 |
-2 FIELD | 指定 文件2 的连接字段 | 示例同上 |
字段分隔符与格式控制选项
如下给出 join 命令的选项中用于字段分隔符与格式控制选项的详细解释说明:
| 选项 | 作用 | 示例 |
|---|---|---|
-t CHAR | 指定输入 / 输出的字段分隔符,默认是空格/制表符 | join -t ',' file1.csv file2.csv处理CSV文件 |
-o FORMAT | 自定义输出格式,格式规则: 1. 用逗号/空格分隔的 FILENUM.FIELD,如 1.2 为文件1的第2字段2. 0 代表连接字段3. auto 自动匹配首行字段数 | join -t ',' -o 1.1,2.3 file1.csv file2.csv输出: 文件1 的第 1 字段 + 逗号 + 文件2 的第 3 字段 |
-e STRING | 用指定的字符串替换缺失的字段,需要配合 -1/-2/-j/-o 选项使用 | join -e 'N/A' -o 1.1,2.2 file1 file2文件2 中无匹配的字段用 "N/A" 填充 |
高级控制选项
如下给出 join 命令的选项中用于高级控制选项的详细解释说明:
| 选项 | 作用 | 示例 |
|---|---|---|
--check-order | 强制检查输入文件是否按连接字段排序 | join --check-order file1 file2若文件未排序,会报错 |
--nocheck-order | 不检查输入文件的排序状态,它会跳过排序验证,可能会导致连接错误 | join --nocheck-order file1 file2当确定文件已经排序时,可以提升连接速度 |
--header | 将每个文件的首行视为字段标题,不参与匹配 | join --header -t ',' file1.csv file2.csv保留两个文件的表头,仅连接数据行 |
-z, --zero-terminated | 用 NUL 字符 \0 替代换行符作为行分隔符 | join -z file1 file2可以与 find -print0/xargs -0 配合使用 |
辅助选项
如下给出 join 命令的选项中基本辅助选项的详细解释说明:
| 选项 | 作用 |
|---|---|
--help | 显示帮助信息并退出 |
--version | 显示版本信息并退出 |
相似命令对比
如下给出与 join 命令具有相似功能的命令之间的对比:
| 命令 | 主要功能 |
|---|---|
| join | 基于字段合并文件 |
| paste | 并行合并文件 |
总结
join 命令是 Linux / Unix / FreeBSD 系统中的一个基于共同字段合并两个文件的工具。在本文中介绍的 join 命令的基本语法形式,并给出了 join 命令的详细使用示例,同时给出了 join 命令的所有选项的详细解释说明,并基于每个选项给出了使用示例。