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

如何按chr{数字}精确匹配分组并将文件传入parallel工具

按chr{数字}精确分组文件并使用parallel处理

问题场景

现有如下文件:

11111-chr1A1.txt
11111-chr1C2.txt
11111-chr1D3.txt
11111-chr114.txt
11111-chr10A1.txt
11111-chr10-C2.txt
11111-chr1003.txt
11111-chr10-4.txt

需要按chr{数字}精确匹配分组:

  • 第一组(chr1相关):
11111-chr1A1.txt
11111-chr1C2.txt
11111-chr1D3.txt
11111-chr114.txt
  • 第二组(chr10相关):
11111-chr10A1.txt
11111-chr10-C2.txt
11111-chr1003.txt
11111-chr10-4.txt

原命令for i in {1..10}; do parallel "echo {1/}" ::: *chr"$i"*txt; done因模式重叠(chr1会匹配到chr10的文件)导致分组错误。

解决方案

方法1:用扩展glob实现精确匹配

先开启shell的扩展匹配功能,针对每个chr数字构造无重叠的匹配模式:

# 开启扩展glob
shopt -s extglob

# 批量处理1到10的chr分组
for i in {1..10}; do
    # 匹配chr$i后非数字,或chr$i后跟任意字符的文件,避免与更长数字的chr重叠
    parallel "echo {1/}" ::: *chr$i!(*[0-9])*.txt *chr$i[0-9]*.txt
done

方法2:正则提取分组后传入parallel

先通过正则提取每个文件对应的chr数字前缀,生成分组文件后再用parallel处理:

# 按chr数字分组生成临时文件
for file in *.txt; do
    if [[ $file =~ chr([0-9]+) ]]; then
        chr_num=${BASH_REMATCH[1]}
        echo "$file" >> "chr${chr_num}_group.txt"
    fi
done

# 遍历分组文件,用parallel处理每组内容
for group in chr*_group.txt; do
    parallel "echo {1/}" :::: "$group"
done

方法3:生成CSV后按列处理

如果需要用CSV格式管理分组,可先生成对应CSV,再让parallel按列读取处理:

# 生成CSV,第一列存chr1组文件,第二列存chr10组文件
paste <(ls *chr1*.txt | grep -E 'chr1([^0-9]|$)') <(ls *chr10*.txt | grep -E 'chr10([^0-9]|$)') > groups.csv

# parallel按列处理CSV内容,{1}对应第一列,{2}对应第二列
parallel "echo 'chr1组文件:{1} | chr10组文件:{2}'" :::: groups.csv

内容的提问来源于stack exchange,提问作者Gabriel G.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 05:20:05