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

使用SAMtools批量转BAM为SAM存新目录的Shell脚本报错求解

批量BAM转SAM脚本实现

原有脚本错误说明

  • bad substitution报错:Shell的${}参数替换语法不支持直接在大括号内写绝对路径开头的内容,${/scratch/xxx}属于非法写法;另外tmp=$(i/scratch/spectre/h/home/Data_Sam)属于命令替换语法,会尝试把i/scratch/...当做系统命令执行,完全不符合变量赋值规则。
  • ambiguous redirect报错:未正确完成文件名的后缀替换和路径拼接,重定向的目标路径不合法,同时如果通配符展开后匹配到多个异常值也会触发该报错。
  • 逻辑缺陷:用ls遍历文件的写法无法兼容文件名带空格、特殊字符的场景;直接拿带输入目录全路径的文件名拼输出路径,会生成不符合预期的嵌套路径;未做输出目录存在性校验、空文件匹配校验,鲁棒性差。

可用脚本

前置检查

  1. 确认samtools已正确安装,可在终端直接调用samtools命令(集群环境提前加载对应环境模块即可)
  2. 执行前先确认输入、输出路径和自身实际存储路径一致,脚本中mkdir -p会自动创建不存在的输出目录,无需手动提前建文件夹。
#!/bin/bash
# 路径配置项,按需修改
INPUT_BAM_DIR="/scratch/spectre/h/homeTCGA_Data"
OUTPUT_SAM_DIR="/scratch/spectre/h/home/Data_Sam"

# 自动创建输出目录
mkdir -p "$OUTPUT_SAM_DIR"

# 遍历所有bam文件,规避ls遍历的兼容问题
for bam_path in "$INPUT_BAM_DIR"/*.bam
do
    # 无匹配bam文件时直接跳过,避免异常
    [ -f "$bam_path" ] || continue
    # 提取去掉路径和.bam后缀的纯文件名
    file_prefix=$(basename "$bam_path" .bam)
    # 拼接输出sam的完整路径
    sam_output_path="$OUTPUT_SAM_DIR/${file_prefix}.sam"
    # 执行转换
    samtools view -h "$bam_path" > "$sam_output_path"
done

使用步骤

  • 将上述代码保存为batch_bam2sam.sh
  • 执行chmod +x batch_bam2sam.sh添加执行权限
  • 终端运行./batch_bam2sam.sh即可启动批量转换

加速方案(可选)

如果500余个文件单线程转换速度慢,可安装GNU Parallel后执行单行命令多线程并行处理,以下命令默认开8个并行任务,可根据自身CPU/集群核数调整-j后的数值:

find "$INPUT_BAM_DIR" -maxdepth 1 -type f -name "*.bam" | parallel -j 8 'samtools view -h {} > "$OUTPUT_SAM_DIR/$(basename {} .bam).sam"'

内容的提问来源于stack exchange,提问作者Megan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:06:51