非常游戏网
如何在Linux中合并两个文本文件 Linux使用cat和join命令的方法

如何在Linux中合并两个文本文件 Linux使用cat和join命令的方法

2026-05-29系统教程74740

cat用于按顺序拼接文件内容,不关心逻辑关系;join则基于公共字段匹配行并横向合并,类似数据库JOIN,要求文件预先按关键字段排序。

catjoin 做的事完全不同:用错命令会导致输出完全不是你想要的结构。别直接套“合并”这个词,先看你要的是拼接、对齐,还是按字段关联。

cat 拼接文件内容(简单追加,不关心内容逻辑)

这是最常用也最容易误用的场景——你以为在“合并”,其实只是把文件 A 的全部内容写完,再把文件 B 的全部内容接在后面。

  • 适用场景:日志归档、配置片段堆叠、纯文本拼接(比如把多个 SQL 语句文件合为一个脚本)
  • 命令就是 cat file1.txt file2.txt > merged.txt,顺序即输出顺序
  • 注意 > 会覆盖目标文件;想追加用 >>,但得确保目标文件已存在或先 touch merged.txt
  • 如果文件里有空行或 BOM 头,cat 不做任何处理,原样拼过去——这可能让后续 awkgrep 解析出错

join 按公共字段关联两行(类似数据库 INNER JOIN)

join 不是拼文件,是查“匹配”。它默认只输出两个文件中第一列值相等的那些行,并把它们横向拼成一行。不匹配的行直接丢掉——这点很多人踩坑。

  • 必须提前排序:sort file1.txt > s1.txt && sort file2.txt > s2.txt && join s1.txt s2.txt,否则行为未定义
  • 默认以空格或制表符为分隔符;若字段含空格,必须用 -t 指定其他分隔符,比如 -t','
  • 指定键列要用 -1-2,例如 join -1 2 -2 1 file1.txt file2.txt 表示用 file1 的第 2 列和 file2 的第 1 列匹配
  • 想保留不匹配的行?加 -a 1(保留 file1 中无匹配的行)或 -v 2(只输出 file2 中无匹配的行)

为什么 join 输出为空?常见三类原因

执行了 join a.txt b.txt 却没输出,不是命令坏了,大概率是以下之一:

Trae linux

Trae Linux 官方版本现已全面上线,开发者可直接访问 Trae 官网(trae.cn 国内版或 trae.ai 国际版)获取专属安装包。该版本完美适配主流 Linux 发行版,提供 .deb(适配 Ubuntu/Debian)、.rpm(适配 RHEL/Fedora)以及通用 .tar.gz 格式,并全面支持 x64 与 ARM64 架构。

  • 两个文件没排序——join 要求输入严格按连接字段升序,哪怕只差一行顺序也会中断匹配
  • 字段分隔不一致——比如 a.txt 用空格,b.txt 用制表符,join 会当成不同字符串;加 -t ' '-t $'\t' 显式声明
  • 字段值表面相同但实际不同——比如有首尾空格、大小写差异(helloHello),可加 -i 忽略大小写,但空格仍需用 sed 's/^[[:space:]]*//;s/[[:space:]]*$//' 清理

cat 还是 join?关键看数据关系

如果你手头是 users.txt(用户名+邮箱)和 orders.txt(用户名+订单号),想生成“用户+邮箱+订单号”,就用 join;如果你只是要把今天和昨天的访问日志合在一起分析总量,就用 cat

没有“更高级”的命令,只有更贴切的工具。硬用 join 处理无关联字段的文件,结果不可控;反过来,用 cat 去处理需要字段对齐的数据,后续解析成本反而更高。