如何用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
相关产品推荐
相关产品推荐

