使用SAMtools批量转BAM为SAM存新目录的Shell脚本报错求解
批量BAM转SAM脚本实现
原有脚本错误说明
bad substitution报错:Shell的${}参数替换语法不支持直接在大括号内写绝对路径开头的内容,${/scratch/xxx}属于非法写法;另外tmp=$(i/scratch/spectre/h/home/Data_Sam)属于命令替换语法,会尝试把i/scratch/...当做系统命令执行,完全不符合变量赋值规则。ambiguous redirect报错:未正确完成文件名的后缀替换和路径拼接,重定向的目标路径不合法,同时如果通配符展开后匹配到多个异常值也会触发该报错。- 逻辑缺陷:用
ls遍历文件的写法无法兼容文件名带空格、特殊字符的场景;直接拿带输入目录全路径的文件名拼输出路径,会生成不符合预期的嵌套路径;未做输出目录存在性校验、空文件匹配校验,鲁棒性差。
可用脚本
前置检查
- 确认samtools已正确安装,可在终端直接调用
samtools命令(集群环境提前加载对应环境模块即可) - 执行前先确认输入、输出路径和自身实际存储路径一致,脚本中
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
相关产品推荐
相关产品推荐

