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

