使用BASH合并目录中具有相同部分ID的fq.gz文件
批量合并相同ID的fq.gz文件解决方案
嘿,看来你需要处理一批fq.gz文件的合并,按文件名里的共同ID分组对吧?我帮你写个简单的bash脚本,轻松搞定这个需求!
核心思路
你的文件名里,从L1开始的部分是唯一的分组标识,比如L1-N707-S504--123V_pre--Hs--R1,我们要把所有包含这个标识的文件合并成一个单独的压缩文件,而且不用解压再合并(直接操作gz文件更高效)。
实现脚本
下面是一个可直接运行的bash脚本,我会一步步解释每个部分:
#!/bin/bash # 定义一个关联数组,用来存储每个ID对应的文件列表 declare -A file_groups # 遍历当前目录下所有的fq.gz文件 for f in *.fq.gz; do # 提取从"L1"开始的部分作为分组ID(不管L1在文件名的第几个位置都能匹配) id=$(echo "$f" | awk -F'-' '{ for(i=1; i<=NF; i++) { if($i ~ /^L1/) { # 找到以L1开头的字段 # 输出从该字段到文件名末尾的内容作为ID print substr($0, index($0, $i)) break } } }') # 如果成功提取到ID,就把当前文件加入对应分组 if [[ -n "$id" ]]; then file_groups["$id"]+="$f " fi done # 遍历每个分组,执行合并操作 for id in "${!file_groups[@]}"; do # 定义合并后的文件名,比如原ID是L1-xxx-R1.fq.gz,合并后变成L1-xxx-R1.merged.fq.gz merged_file="${id%.fq.gz}.merged.fq.gz" echo "正在合并ID为 $id 的文件到 $merged_file..." # 直接cat多个gz文件,输出到新的压缩文件(gzip支持串联合并,无需解压) cat ${file_groups["$id"]} > "$merged_file" # 可选:验证合并后的文件完整性(如果需要的话) # gunzip -t "$merged_file" && echo "$merged_file 合并成功且有效!" done
关键细节说明
- ID提取逻辑:用awk查找文件名中以
L1开头的字段,然后提取从该字段到末尾的内容作为分组ID,这个方式比固定分割更灵活,就算前面的日期/FC编号格式有变化也能适配。 - 高效合并:直接使用
cat合并gz文件是完全可行的,因为gzip格式允许多个压缩文件串联,合并后的文件可以正常解压,而且比先解压合并再压缩快得多。 - 安全备份:合并后的文件名带
.merged后缀,不会覆盖原文件,你可以在确认合并正确后再处理原文件。
使用步骤
- 把脚本保存为
merge_fq.sh - 给脚本添加执行权限:
chmod +x merge_fq.sh - 进入你的fq.gz文件所在目录,运行脚本:
./merge_fq.sh
注意事项
- 如果你的文件名包含空格,需要稍微调整脚本(把
file_groups["$id"]+="$f "改成file_groups["$id"]+="$f;",然后合并时用IFS=';' read -ra files <<< "${file_groups[$id]}"再循环cat "${files[@]}"),不过看你的例子文件名没有空格,应该没问题。 - 建议先在小批量文件上测试脚本,确认分组和合并结果正确后再处理1000个文件。
内容的提问来源于stack exchange,提问作者zoe
相关产品推荐
相关产品推荐

