You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Bash处理两个文本文件,实现匹配行前置并输出到新文件?

在Bash中实现A.txt与B.txt的匹配行合并需求

首先咱们先明确需求:对比两个CSV格式文件的每行前三个数字字段,当A.txt和B.txt里的这部分内容完全匹配时,把B里的对应行放到A对应行的上方,最终把结果保存到新文件里。

先看看你的示例文件内容:

A.txt内容:

10,1,1,"ABC"
10,1,2,"ABC"
10,1,3,"baba"
10,2,1,"asd"
10,2,2,"dkkd"

B.txt内容:

10,1,2,"S1"
10,2,1,"S2"
10,2,2,"S3"

我推荐用awk来处理这个需求,它天生擅长处理文本字段的匹配和操作,而且可以一步完成,不需要额外的临时文件。直接用下面的命令就能实现:

awk -F ',' '
NR==FNR {
    # 先读取B.txt,用前三个字段拼接成唯一键,存储对应行内容
    key = $1 "," $2 "," $3
    b_lines[key] = $0
    next
}
{
    # 处理A.txt的每一行
    key = $1 "," $2 "," $3
    # 如果当前行的键在B.txt里存在,先打印B的对应行
    if (key in b_lines) {
        print b_lines[key]
    }
    # 再打印A的当前行
    print $0
}' B.txt A.txt > result.txt

命令解释:

  • -F ',':告诉awk用逗号作为字段分隔符,这样我们能轻松提取每行的前三个字段
  • NR==FNR:这个条件只在处理第一个输入文件(也就是B.txt)时成立,我们把每行的前三个字段拼接成key,把整行内容存在数组b_lines里,next让awk跳过后面的逻辑,继续处理下一行
  • 处理A.txt时,对每行生成同样的key,如果这个key在b_lines数组中存在,就先打印B里的对应行,再打印A的当前行;如果没有匹配,就直接打印A的行
  • 最后用> result.txt把结果输出到新文件里

运行这个命令后,result.txt的内容会是:

10,1,1,"ABC"
10,1,2,"S1"
10,1,2,"ABC"
10,1,3,"baba"
10,2,1,"S2"
10,2,1,"asd"
10,2,2,"S3"
10,2,2,"dkkd"

完全符合你要的效果~

内容的提问来源于stack exchange,提问作者Biki Teron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:22:01