Linux join 命令超全详解:文本文件关联合并神器,数据处理必备

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 Eve

departments.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.txt

5. 注意事项

  • 排序要求:这是最重要的一点。join 命令要求两个输入文件必须已按照连接键严格排序(通常为字典序)。如果文件未排序,结果将不可预测或报错。务必先使用 sort 命令对连接字段进行排序。

plaintext

join <(sort file1) <(sort file2)
  • 字段分隔符:默认字段分隔符是空白字符(空格 / 制表符),会忽略行首的空白并将连续的空白视为一个分隔符。若需精确控制,应使用 -t 选项指定单一字符作为分隔符。
  • 连接键唯一性:如果某个文件中有多行的连接键值相同,join 会生成所有可能的配对组合,这可能导致输出行数激增。
  • 文件格式:两个文件的字段分隔符应保持一致。如果使用 -t 指定了分隔符,它将同时应用于输入和输出。
  • 字段编号:字段编号从 1 开始,而不是 0。
  • 性能:对于非常大的文件,join 可能比某些数据库操作或高级编程语言处理慢,但对于系统脚本和日常文本处理任务,它非常高效便捷。

获取更多Linux学习资料请关注“阿成学长工具包”,对话框中输入2647获取