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

Bash判断目录下.fastq文件是否存在 不存在则执行samtools命令

原脚本核心问题
  • 通配符逻辑完全失效:[ -e 通配符路径 ] 仅支持单文件匹配场景,当匹配到0个或多个.fastq文件时判断结果完全错误;被双引号包裹的通配符"*.bam"/"*.fastq"会被shell识别为文件名叫*.bam/*.fastq的单个文件,不会匹配所有对应后缀的文件。
  • 输出逻辑混乱:直接将所有bam的转换结果重定向到名为*.fastq的文件,会把所有样本的测序数据混在一起,后续拆分出的r1/r2文件也无法对应原始bam样本。
  • 路径不匹配:判断逻辑使用Sample_*通配匹配所有样本目录,和需求指定检测Sample_140/analysis目录的要求不一致。
修正后可用脚本
#!/bin/bash
# 定义目标处理目录
TARGET_DIR="./Sample_140/analysis"
# 开启nullglob配置:通配符无匹配结果时返回空值,避免判断逻辑出错
shopt -s nullglob

# 检测目录下是否已存在fastq文件
fastq_files=("$TARGET_DIR"/*.fastq)
if [ ${#fastq_files[@]} -gt 0 ]; then
    echo "Fastq files exist, no operation needed."
    exit 0
fi

# 进入目标目录,目录不存在则直接退出
cd "$TARGET_DIR" || exit 1

# 逐个遍历bam文件处理,避免样本数据混淆
for bam in *.bam; do
    # 提取文件名前缀(剔除.bam后缀)
    file_prefix="${bam%.bam}"
    # 执行bam转fastq
    samtools bam2fq "$bam" > "${file_prefix}.fastq"
    # 拆分双端r1序列
    grep '^@.*/1$' -A 3 --no-group-separator "${file_prefix}.fastq" > "${file_prefix}_r1.fastq"
    # 拆分双端r2序列
    grep '^@.*/2$' -A 3 --no-group-separator "${file_prefix}.fastq" > "${file_prefix}_r2.fastq"
done
使用说明
  • 脚本依赖GNU版本grep(支持--no-group-separator参数),macOS环境需先通过homebrew安装grep,将脚本中grep替换为ggrep即可正常运行。
  • 脚本默认保留bam转换生成的全量fastq文件,如果不需要保留,可在拆分r1/r2的命令后添加rm "${file_prefix}.fastq"删除临时文件。
  • 如果需要批量处理所有Sample_*目录下的analysis文件夹,只需把TARGET_DIR的单路径定义改为循环遍历./Sample_*/analysis即可,内部处理逻辑无需修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:27:34