如何在Bash循环中匹配文件名两段内容以批量合并文件?
按规则批量合并文件的Bash解决方案
需求说明
现有一批文件名格式如下的文件:
JOHN_80_xyz_yeti.txt JOHN_80_xyz_puma.txt JOHN_80_def_yeti.txt JOHN_80_def_puma.txt JOHN_81_xyz_yeti.txt JOHN_81_xyz_puma.txt JOHN_81_def_yeti.txt JOHN_81_def_puma.txt JOHN_82_xyz_yeti.txt JOHN_82_xyz_puma.txt JOHN_82_def_yeti.txt JOHN_82_def_puma.txt JOHN_83_xyz_yeti.txt JOHN_83_xyz_puma.txt JOHN_83_def_yeti.txt JOHN_83_def_puma.txt
需要按规则合并:将同数字(如80)、同标识(如yeti)的xyz和def前缀文件合并,输出格式为merged.JOHN_<数字>_<标识>.txt,比如:
merge -1 JOHN_80_xyz_yeti.txt -2 JOHN_80_def_yeti.txt > merged.JOHN_80_yeti.txt merge -1 JOHN_80_xyz_puma.txt -2 JOHN_80_def_puma.txt > merged.JOHN_80_puma.txt
实现方案
可以通过Bash循环结合文本处理命令提取分组变量,批量执行合并:
1. 提取唯一合并分组
首先获取所有唯一的数字_标识组合(如80_yeti、80_puma),命令如下:
ls JOHN_*.txt | awk -F'_' '{print $2"_"$4}' | sed 's/.txt$//' | sort -u
ls JOHN_*.txt:列出所有目标文件awk -F'_' '{print $2"_"$4}':按下划线分割文件名,提取第2段(数字)和第4段(标识)sed 's/.txt$//':去掉文件名末尾的.txt后缀sort -u:去重得到唯一的分组组合
2. 批量合并脚本
将上述逻辑整合为循环脚本,自动处理所有分组:
#!/bin/bash # 遍历所有唯一的合并分组 for group in $(ls JOHN_*.txt | awk -F'_' '{print $2"_"$4}' | sed 's/.txt$//' | sort -u); do # 拆分分组为数字和标识 num=$(echo "$group" | cut -d'_' -f1) tag=$(echo "$group" | cut -d'_' -f2) # 定义输入文件和输出文件名 file1="JOHN_${num}_xyz_${tag}.txt" file2="JOHN_${num}_def_${tag}.txt" output_file="merged.JOHN_${num}_${tag}.txt" # 检查文件是否存在,避免执行错误 if [ -f "$file1" ] && [ -f "$file2" ]; then merge -1 "$file1" -2 "$file2" > "$output_file" echo "完成合并:$file1 + $file2 -> $output_file" else echo "跳过:$file1 或 $file2 不存在" fi done
3. 脚本使用说明
- 将上述代码保存为
merge_files.sh - 赋予执行权限:
chmod +x merge_files.sh - 在文件所在目录执行脚本:
./merge_files.sh
内容的提问来源于stack exchange,提问作者user21090106
相关产品推荐
相关产品推荐

