如何在Bash中按物种标识批量合并fastq.gz文件?
基于物种标识自动合并fastq.gz文件的Bash脚本方案
问题背景
需要根据文件名中的物种标识(如示例中的107、1322)自动合并对应fastq.gz文件,无需手动指定物种名称,让脚本可复用在不同物种组。待处理文件名示例:
GSF3164-Moyle-107-6_L_S75_R1_001.fastq.gz GSF3164-Moyle-107-6_L_S75_R2_001.fastq.gz GSF3164-Moyle-107-7_F_S48_R1_001.fastq.gz GSF3164-Moyle-107-7_F_S48_R2_001.fastq.gz GSF3164-Moyle-107-7_L_S76_R1_001.fastq.gz GSF3164-Moyle-107-7_L_S76_R2_001.fastq.gz GSF3164-Moyle-1322-10_F_S44_R1_001.fastq.gz GSF3164-Moyle-1322-10_F_S44_R2_001.fastq.gz GSF3164-Moyle-1322-10_L_S96_R1_001.fastq.gz GSF3164-Moyle-1322-10_L_S96_R2_001.fastq.gz GSF3164-Moyle-1322-1_F_S42_R1_001.fastq.gz GSF3164-Moyle-1322-1_F_S42_R2_001.fastq.gz
解决方案
方案1:合并同一物种的所有文件(不分R1/R2)
如果需要将同一物种的所有fastq.gz文件合并为单个文件,使用以下脚本:
# 创建输出目录(不存在则自动创建) mkdir -p otherFolder # 提取所有唯一物种标识并遍历 for species in $(ls GSF3164-Moyle-*.fastq.gz | cut -d'-' -f3 | sort -u); do cat GSF3164-Moyle-${species}-*.fastq.gz > otherFolder/${species}.fastq.gz done
方案2:按R1/R2分别合并(推荐)
测序数据通常需要将正反向读段(R1/R2)分开合并,更符合下游分析需求:
mkdir -p otherFolder # 获取唯一物种列表 species_list=$(ls GSF3164-Moyle-*.fastq.gz | cut -d'-' -f3 | sort -u) # 遍历每个物种,分别合并R1和R2文件 for species in $species_list; do cat GSF3164-Moyle-${species}-*_R1_*.fastq.gz > otherFolder/${species}_R1.fastq.gz cat GSF3164-Moyle-${species}-*_R2_*.fastq.gz > otherFolder/${species}_R2.fastq.gz done
关键步骤解释
- 提取物种标识:
cut -d'-' -f3以-为分隔符,截取文件名第3段(即物种标识),sort -u确保每个物种只出现一次 - 输出目录准备:
mkdir -p otherFolder避免因目录不存在导致的错误 - 合并压缩文件:直接使用
cat合并gz文件是可行的,gzip格式原生支持拼接操作
注意事项
- 确保当前目录仅包含目标fastq.gz文件,避免无关文件干扰物种标识提取
- 若文件名格式变更,需调整
cut命令的字段位置(例如物种标识在第4段则改为-f4)
内容的提问来源于stack exchange,提问作者tbiewerh
相关产品推荐
相关产品推荐

