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

使用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后缀,不会覆盖原文件,你可以在确认合并正确后再处理原文件。

使用步骤

  1. 把脚本保存为merge_fq.sh
  2. 给脚本添加执行权限:chmod +x merge_fq.sh
  3. 进入你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:14:49