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

如何在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. 脚本使用说明

  1. 将上述代码保存为merge_files.sh
  2. 赋予执行权限:chmod +x merge_files.sh
  3. 在文件所在目录执行脚本:./merge_files.sh

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:20:34