首页>教程>Linux 命令手册> 文件内容查看与处理 >Linux join 命令 - 基于共同字段合并文件

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=文件12=文件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 FIELDFIELD 为字段编号,同时指定两个文件的连接字段的编号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 命令的所有选项的详细解释说明,并基于每个选项给出了使用示例。