当前位置: 首页 > news >正文

Linux/macOS下用Shell脚本自动批量下载SRA测序数据并转FASTQ

本文还有配套的精品资源,点击获取

简介:一套开箱即用的命令行工具,专为批量获取NCBI SRA数据库中的原始测序数据设计。核心脚本sra-download.sh读取SraAccList.txt里的SRA编号(如SRR1234567),再对照sample_list.txt中的样本名,自动创建带命名逻辑的输出目录结构,下载完成后直接生成标准FASTQ文件(支持gzip压缩)。整个流程支持一次处理几十到几百个SRA条目,无需人工干预,不依赖图形界面。已内置示例数据(含ATAC_N1_1.fastq.gz等真实FASTQ)、预配置的列表模板和完整README说明,还包含重复校验所需的文件结构参考。运行前需在Linux或macOS系统中安装sra-toolkit 3.0.0及以上版本,并完成prefetch初始化配置。所有操作均通过终端执行,适合生信分析前的数据准备环节,可无缝衔接后续质控、比对或组装流程。

1. 项目概述:为什么你需要这套脚本,而不是手动敲几十遍fastq-dump

在生物信息分析的日常工作中,我几乎每周都要从NCBI SRA数据库拉取公开数据——可能是别人发表的ATAC-seq、ChIP-seq、单细胞RNA-seq,也可能是自己实验室上传后需要回溯验证的原始reads。最开始,我用prefetch SRR1234567 && fastq-dump --gzip --outdir ./fastq SRR1234567一条条复制粘贴,处理10个SRA还行;到第37个时,手抖输错一个SRR编号,fastq-dump报错退出,前面36个白跑了,还得逐个检查.sra文件是否完整、.fastq.gz是否生成成功、文件名是不是带了_1_2后缀……那一刻我就决定:必须把这件事交给Shell。

这套sra-download.sh不是“又一个下载脚本”,它解决的是真实批量场景下的三重断点
第一是命名混乱——SRA登录号(如SRR1234567)对人毫无意义,但下游比对、质控工具(如fastpbwaSTAR)要求输入文件名体现样本来源(比如ATAC_N1_1.fastq.gz)。手动重命名百个文件?不现实。
第二是流程断裂——prefetch只下.srafastq-dump才转FASTQ,中间若网络中断、磁盘满、权限不足,脚本就卡死,你得人工介入查日志、删残缺文件、续传。而这个脚本内置状态检查与断点续传逻辑,失败条目自动跳过并记录到failed.log,不影响后续任务。
第三是环境不可控——Mac用户常被brew install sra-tools后的路径问题折磨(/opt/homebrew/binvs/usr/local/bin),Linux用户可能遇到libcrypto版本冲突。脚本开头就做command -v prefetchcommand -v fastq-dump双校验,并提示缺失时的精准安装命令(含macOS M1/M2芯片适配说明),不让你卡在第一步。

它面向三类人:
-刚入门的生信新手:不用记--split-files--gzip参数组合,sample_list.txt里写好SRR1234567\tATAC_N1,运行脚本就出ATAC_N1_1.fastq.gzATAC_N1_2.fastq.gz
-跑批量分析的老手:支持--dry-run预览将要执行的命令,支持--threads 8指定并发数,支持--outdir /data/sra_fastq自定义根目录,所有配置都集中在一个config.sh里,改一处全局生效;
-需要复现的科研人员SraAccList.txtsample_list.txt是纯文本,可直接Git版本管理;每个FASTQ文件生成时自动写入md5sumchecksums.md5,确保数据完整性可审计。

关键词里的“SRA批量下载”不是指“能下多个”,而是指按实验设计逻辑组织输出;“FASTQ转换”不是简单调用fastq-dump,而是根据--split-3--split-files策略智能判断单端/双端,并补全_1/_2后缀;“Shell自动化”意味着它不依赖Python环境、不装额外包、不改系统PATH,只要bashsra-toolkit在PATH里,chmod +x sra-download.sh && ./sra-download.sh就能跑通;“sra-toolkit”在这里不是可选依赖,而是整个流程的基石——我们后面会深入讲为什么必须用v3.0.0+,以及如何绕过它最坑的三个默认行为。


2. 核心设计思路拆解:为什么不用parallel+xargs,而要自己写状态机

很多人第一反应是:“不就是循环下载吗?用cat SraAccList.txt | parallel -j 4 'prefetch {} && fastq-dump --gzip {}'不就完了?”——我试过,而且踩了深坑。下面说清楚为什么这个脚本选择“自己造轮子”,而不是套用现成的并行工具。

2.1 并行不是越多越好:sra-toolkit的资源锁机制

sra-toolkit底层用libsra访问NCBI的云存储,它内部有连接池和缓存锁。实测发现:当parallel -j 8同时启动8个prefetch进程时,前2个能正常下载,后6个会卡在Resolving...状态长达10分钟以上,最终超时失败。这是因为sra-toolkit默认只允许2个并发HTTP连接(可通过~/.ncbi/user-settings.mkfg修改,但普通用户根本找不到这个文件在哪)。而我们的脚本采用串行预取+并行转换策略:先用单线程prefetch把所有.sra文件拉到本地缓存(~/ncbi/dbGaP-*/),再用多线程fastq-dump从本地缓存读取转换。这样既规避了网络并发瓶颈,又保证了转换阶段的CPU利用率。

提示:脚本中PREFETCH_CONCURRENCY=1是硬编码值,不是bug,是经验之谈。如果你的服务器带宽超1Gbps且磁盘IO极强(如NVMe RAID),可手动改为2,但务必配合--max-size 50G限制单个SRA缓存大小,否则prefetch会把整个~/ncbi/塞爆。

2.2 状态持久化:为什么failed.logset -e更可靠

Shell里常用set -e让脚本在任意命令失败时退出。但sra-toolkit的错误码很“佛系”:prefetch下载失败返回124,fastq-dump内存不足返回137,而网络超时可能返回0(因为它把部分数据写进了临时文件)。如果只靠set -e,脚本会在第5个SRA失败时直接终止,剩下95个永远没机会执行。我们的方案是:每个SRA处理封装为独立函数,函数内用if ! command; then echo "SRRxxx failed" >> failed.log; continue; fi显式捕获错误,并记录失败原因(如curl: (7) Failed to connectfastq-dump: error while loading shared libraries。这样即使100个里失败30个,脚本仍能跑完,最后给你一份清晰的failed.log,你可以针对性重试,而不是重头再来。

2.3 命名逻辑的工程化实现:从SRR1234567ATAC_N1_1.fastq.gz的三步映射

这是整个脚本最核心的设计。很多教程教你在fastq-dump后用mv重命名,但问题在于:
-fastq-dump SRR1234567默认输出SRR1234567.fastq.gz(单端)或SRR1234567_1.fastq.gz/SRR1234567_2.fastq.gz(双端);
- 但SRR1234567对应哪个样本?哪个测序批次?哪个文库类型?这些信息不在SRA元数据里,必须由你人工维护。

我们的解法是引入双列表映射机制
1.SraAccList.txt:纯SRA登录号列表,每行一个,无空格无注释(SRR1234567\nSRR7654321\n);
2.sample_list.txt:TSV格式,第一列SRA号,第二列样本名,第三列可选文库类型(如paired/single),第四列可选压缩策略(gzip/none);
SRR1234567 ATAC_N1 paired gzip SRR7654321 RNA_S2 single none
脚本读取时,用awk 'NR==FNR{acc[$1]=1;next} $1 in acc{print}' SraAccList.txt sample_list.txt做交集过滤,确保只处理两个文件都存在的SRA号。然后对每个匹配行,执行:
-prefetch --output-directory ./cache $sra_id→ 下载到./cache/SRR1234567.sra
-fastq-dump --split-files --gzip --outdir ./fastq --skip-technical --read-filter pass $sra_id→ 输出./fastq/SRR1234567_1.fastq.gz./fastq/SRR1234567_2.fastq.gz
- 最后用mv ./fastq/${sra_id}_1.fastq.gz ./fastq/${sample_name}_1.fastq.gz完成语义化重命名。

注意:--skip-technical跳过接头、引物等技术序列,--read-filter pass只保留质量合格的reads——这两个参数是生信分析的黄金组合,避免下游工具因低质量reads报错。脚本默认开启,你不需要记住。

2.4 安全边界控制:为什么--max-size--verify不是可选项

SRA数据库里有些条目是整套WGS数据,单个SRA超200GB。如果脚本不加限制,prefetch SRR9999999可能一夜之间吃光你1TB硬盘。因此脚本强制要求在config.sh中设置MAX_SRA_SIZE="50G"(单位支持K/M/G/T),并在prefetch命令中加入--max-size $MAX_SRA_SIZE。实测发现:当--max-size 50G时,prefetch对超大SRA会返回错误码255并输出Error: SRA object exceeds maximum allowed size,脚本捕获此错误后写入failed.log并继续下一个,而不是硬扛。

另一个关键是--verifyprefetch默认不校验下载完整性,只检查HTTP响应头。而NCBI偶尔会因CDN缓存问题返回截断的.sra文件(尤其在中国大陆节点)。开启--verify后,prefetch会下载完成后用SHA256比对NCBI服务器上的原始哈希值,确保字节级一致。虽然耗时增加15%,但避免了后续fastq-dump解析时报Invalid SRA file这种让人抓狂的错误。脚本默认启用,且在failed.log中明确标注“VERIFY FAILED”便于排查。


3. 核心细节解析与实操要点:从零配置到首次成功运行

现在我们进入实操环节。别急着运行脚本,先理解每个配置项背后的物理意义。我以macOS Monterey(M1 Pro芯片)和Ubuntu 22.04 LTS为例,全程演示如何让脚本真正“开箱即用”。

3.1 sra-toolkit安装:避开官方文档埋的三个雷

NCBI官网的安装指南写着“conda install -c bioconda sra-tools”,但这是最不推荐的方式。原因有三:
- Conda环境中的sra-toolkit常与系统Python冲突,尤其当你用pyenv管理Python版本时,fastq-dump可能加载错误的libpython导致Segmentation Fault;
- Bioconda频道的sra-tools更新滞后,v3.0.0发布半年后,Conda版本还是v2.11.3,缺少关键的--verify--max-size支持;
- Conda安装的二进制文件路径不统一(~/miniconda3/bin/or~/anaconda3/bin/),脚本检测时容易漏判。

正确姿势(macOS):

# 1. 用Homebrew安装(M1/M2芯片必须用arm64版本) arch -arm64 brew install sra-tools # 2. 验证安装路径(应为/opt/homebrew/bin/) which prefetch fastq-dump # 输出:/opt/homebrew/bin/prefetch 和 /opt/homebrew/bin/fastq-dump # 3. 初始化配置(关键!这步决定后续是否能连上NCBI) vdb-config --interactive # 在交互界面中: # - 按2进入"Preferences" # - 按1进入"Network" # - 将"Cache Directory"设为高速磁盘(如/Volumes/SSD/ncbi_cache) # - 将"Network Timeout"从30秒改为120秒(防国内网络波动) # - 按Esc退出,保存配置

正确姿势(Linux):

# 1. 下载官方二进制包(不要用apt,Ubuntu源太旧) wget https://ftp-trace.ncbi.nlm.nih.gov/sra/sdk/current/sratoolkit.current-ubuntu64.tar.gz tar -xzf sratoolkit.current-ubuntu64.tar.gz export PATH=$PWD/sratoolkit.3.0.3-ubuntu64/bin:$PATH # 2. 创建软链接避免路径硬编码(脚本检测时会找prefetch在PATH中) sudo ln -sf $PWD/sratoolkit.3.0.3-ubuntu64/bin/prefetch /usr/local/bin/prefetch sudo ln -sf $PWD/sratoolkit.3.0.3-ubuntu64/bin/fastq-dump /usr/local/bin/fastq-dump # 3. 初始化(同macOS,但配置文件在~/.ncbi/) vdb-config --interactive

提示:vdb-config --interactive生成的配置文件在~/.ncbi/user-settings.mkfg,里面有一行/repository/user/main/public/root = "/path/to/cache",这就是prefetch默认下载位置。脚本里所有--output-directory参数都基于此路径做相对定位,所以初始化这一步绝不能跳过。

3.2 配置文件config.sh详解:每个变量都是血泪教训

脚本根目录下的config.sh是唯一需要你手动编辑的文件。它不是“配置模板”,而是运行时的决策中心。以下是逐行解读:

#!/bin/bash # config.sh —— 所有可调参数集中在此 # 【必填】SRA登录号列表文件路径(绝对路径或相对于脚本所在目录) SRA_LIST="SraAccList.txt" # 【必填】样本映射表路径(TSV格式,SRA_ID<tab>Sample_Name<tab>Library_Type<tab>Compression) SAMPLE_MAP="sample_list.txt" # 【必填】本地缓存目录(prefetch下载.sra文件的位置) # 强烈建议设在SSD或高速NAS,避免HDD成为IO瓶颈 CACHE_DIR="./cache" # 【必填】FASTQ输出根目录(最终生成ATAC_N1_1.fastq.gz的地方) FASTQ_DIR="./fastq" # 【可选】最大单个SRA文件大小(防止下载超大WGS数据撑爆磁盘) # 单位:K/M/G/T,必须带字母,如"50G"、"2T" MAX_SRA_SIZE="50G" # 【可选】并发线程数(fastq-dump阶段,prefetch始终单线程) # 经验值:CPU核心数-2,留2核给系统和其他进程 THREADS=6 # 【可选】是否启用校验(强烈建议true,避免数据损坏) VERIFY=true # 【可选】是否启用gzip压缩(false则输出未压缩FASTQ,占空间但IO快) GZIP_COMPRESSION=true # 【可选】是否跳过已存在的FASTQ文件(用于增量更新) SKIP_EXISTING=true # 【可选】日志级别(debug/info/warn/error) LOG_LEVEL="info" # 【高级】自定义fastq-dump参数(慎用!覆盖默认安全参数) # 默认已包含:--skip-technical --read-filter pass --clip # 如需添加--origfmt,请取消下面注释并确认你的下游工具支持 # FASTQ_DUMP_OPTS="--origfmt"

重点解释三个易错点:
-CACHE_DIRFASTQ_DIR必须是相对路径或绝对路径,不能是~/开头的波浪线。因为Shell脚本中~在非交互式环境下不会展开,prefetch --output-directory ~/cache会被当成字面量目录名,导致创建./~/cache这种诡异路径。正确写法是CACHE_DIR="$HOME/cache"CACHE_DIR="/data/ncbi_cache"
-SKIP_EXISTING=true不是简单的[ -f "$out_file" ] && continue。脚本实际检查的是$FASTQ_DIR/$sample_name_1.fastq.gz$FASTQ_DIR/$sample_name_2.fastq.gz(双端)或$FASTQ_DIR/$sample_name.fastq.gz(单端)是否存在,且文件大小>1MB(排除空文件)。这样即使你中途Ctrl+C,重启后也不会重复转换。
-LOG_LEVEL="debug"会输出每一行执行的完整命令(如+ prefetch --max-size 50G --output-directory ./cache SRR1234567),适合排查网络问题;"error"则只记录失败条目,适合生产环境静默运行。

3.3 示例文件example/的结构意图:教你如何组织自己的数据

example/目录不是摆设,它是最小可行实验单元。里面包含:
-SraAccList.txt:仅两行SRR1234567SRR7654321
-sample_list.txt:对应两行SRR1234567\tATAC_N1\tpaired\tgzipSRR7654321\tRNA_S2\tsingle\tnone
-ATAC_N1_1.fastq.gzATAC_N1_2.fastq.gz:真实的、可直接用zcat ATAC_N1_1.fastq.gz | head -n 4查看的FASTQ内容(前4行是第一条read的ID、序列、+号、质量值);
-checksums.md5:记录这两个FASTQ文件的MD5值,供你验证脚本生成结果是否一致。

它的设计逻辑是:你能用example/里的文件跑通脚本,就证明你的环境100%可用;反之,如果example/都跑不通,一定是环境问题,不是数据问题。我建议你首次运行时,先cp -r example/* .覆盖当前目录,然后./sra-download.sh——如果成功,你会看到:
-./cache/SRR1234567.sra(约1.2GB);
-./fastq/ATAC_N1_1.fastq.gz./fastq/ATAC_N1_2.fastq.gz(各约600MB);
-./fastq/checksums.md5里新增两行MD5;
-./sra-download.log里记录时间戳和成功条目。

实操心得:第一次运行时,我总在./fastq/里看到SRR1234567_1.fastq.gz而不是ATAC_N1_1.fastq.gz,查了半小时才发现sample_list.txt里SRA号多了一个空格(SRR1234567),导致awk匹配失败。脚本为此增加了空格trim逻辑:sra_id=$(echo "$sra_id" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//'),但最好的习惯仍是编辑TSV时用VS Code打开,开启“显示空白字符”功能。


4. 实操过程与核心环节实现:一次完整运行的逐帧解析

现在我们模拟一次真实运行。假设你要下载某篇Nature论文补充材料里的23个ATAC-seq样本,SRA号已整理好,目标是生成SAMPLE_A_1.fastq.gz格式的文件,存到/data/project_x/atac_fastq/

4.1 准备工作:构建你的专属输入文件

首先,创建干净的工作目录:

mkdir -p /data/project_x/sra_download cd /data/project_x/sra_download

然后,准备两个核心输入文件:
-SraAccList.txt:把你从论文Supplementary Table里复制的23个SRA号,每行一个,确保无空行、无空格、无中文逗号。可以用sed -i 's/[[:space:]]*$//' SraAccList.txt清理尾部空格。
-sample_list.txt:用Excel或LibreOffice Calc编辑,列为:SRA_ID、Sample_Name、Library_Type、Compression。例如:
SRR1234567 SAMPLE_A paired gzip SRR2345678 SAMPLE_B paired gzip ... SRR9876543 SAMPLE_W paired gzip
保存为UTF-8编码的TSV格式(不是CSV!),用file sample_list.txt确认输出sample_list.txt: UTF-8 Unicode text, with CRLF line terminators,如果是with CR line terminators,用dos2unix sample_list.txt转换。

提示:Library_Type列必须小写且精确为pairedsingle。脚本用if [[ "$lib_type" == "paired" ]]; then ...判断,写成PairedPAIRED会导致fastq-dump不加--split-files参数,双端数据全挤在一个文件里,下游bwa mem直接报错。

4.2 配置config.sh:针对本次任务定制

编辑config.sh

SRA_LIST="SraAccList.txt" SAMPLE_MAP="sample_list.txt" CACHE_DIR="/data/project_x/sra_cache" # SSD盘,预留200GB FASTQ_DIR="/data/project_x/atac_fastq" # 目标输出目录 MAX_SRA_SIZE="30G" # 论文里最大SRA是28G,留2G余量 THREADS=8 # 服务器有16核,留8核给其他任务 VERIFY=true GZIP_COMPRESSION=true SKIP_EXISTING=true LOG_LEVEL="info"

4.3 首次运行:观察日志,理解每个阶段

执行:

chmod +x sra-download.sh time ./sra-download.sh

输出日志分四段,我们逐段解读:

阶段一:环境与配置检查(约5秒)

[INFO] Checking dependencies... [INFO] prefetch found at /opt/homebrew/bin/prefetch [INFO] fastq-dump found at /opt/homebrew/bin/fastq-dump [INFO] sra-toolkit version: 3.0.3 [INFO] Loading config from config.sh... [INFO] SRA list: SraAccList.txt (23 entries) [INFO] Sample map: sample_list.txt (23 entries) [INFO] Cache dir: /data/project_x/sra_cache [INFO] FASTQ dir: /data/project_x/atac_fastq

这里脚本做了三件事:
-command -v prefetchcommand -v fastq-dump确认二进制存在;
-prefetch --version 2>&1 | grep "sratoolkit"提取版本号,确保≥3.0.0;
-wc -l < SraAccList.txtwc -l < sample_list.txt统计行数,并用comm -12 <(sort SraAccList.txt) <(sort -k1,1 sample_list.txt) | wc -l计算交集数量,确保23个SRA在两个文件里都存在。如果交集只有20,脚本会报错并列出缺失的3个SRA号。

阶段二:预取(prefetch)阶段(耗时最长,取决于网络)

[INFO] Starting prefetch phase (1/23)... [INFO] prefetch --max-size 30G --verify --output-directory /data/project_x/sra_cache SRR1234567 [INFO] Downloading SRR1234567... [████████████████████] 100% 1.23G/1.23G @ 8.2MB/s [INFO] Verification passed for SRR1234567 [INFO] Starting prefetch phase (2/23)... ...

注意两点:
- 进度条是脚本自己用pv(Pipe Viewer)实现的,如果系统没装pv,会退化为纯文字进度(不影响功能);
-Verification passed表示SHA256校验通过,这是数据可靠的铁证。

阶段三:转换(fastq-dump)阶段(CPU密集型)

[INFO] Starting fastq-dump phase (1/23)... [INFO] fastq-dump --split-files --gzip --outdir /data/project_x/atac_fastq --skip-technical --read-filter pass --threads 8 /data/project_x/sra_cache/SRR1234567.sra [INFO] Converting SRR1234567 to FASTQ... [████████████████████] 100% 1.23G/1.23G @ 120MB/s [INFO] Renaming SRR1234567_1.fastq.gz to SAMPLE_A_1.fastq.gz [INFO] Renaming SRR1234567_2.fastq.gz to SAMPLE_A_2.fastq.gz [INFO] Calculating MD5 for SAMPLE_A_1.fastq.gz... [INFO] Calculating MD5 for SAMPLE_A_2.fastq.gz...

这里的关键是--threads 8——fastq-dump的多线程是真正的并行解压和格式转换,不是伪并行。实测8线程比单线程快5.2倍(不是8倍,因为有IO和内存带宽瓶颈)。

阶段四:收尾与校验

[INFO] All done! 23/23 SRA processed. [INFO] Successful: 23, Failed: 0 [INFO] Output FASTQ files in /data/project_x/atac_fastq/ [INFO] Checksums written to /data/project_x/atac_fastq/checksums.md5 [INFO] Log saved to /data/project_x/sra_download/sra-download.log

此时,/data/project_x/atac_fastq/下应该有46个文件(23×2),每个SAMPLE_X_1.fastq.gz文件用zcat查看前4行,应该是标准FASTQ格式:

@SRR1234567.1 1 length=150 NGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGA + IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

4.4 处理失败:failed.log里的每一行都是线索

假设第7个SRA(SRR3456789)失败,failed.log里记录:

2024-06-15 14:22:33 ERROR SRR3456789: prefetch failed with code 255: Error: SRA object exceeds maximum allowed size

这说明该SRA实际大小超30G,而你设的MAX_SRA_SIZE="30G"。解决方案:
- 查NCBI SRA页面确认该SRA真实大小(页面右上角有“Size”字段);
- 如果确实是35G,临时修改config.shMAX_SRA_SIZE="40G"
- 删除./cache/SRR3456789.sra(避免prefetch跳过);
- 运行./sra-download.sh --resume-from SRR3456789(脚本支持--resume-from参数,从指定SRA继续,不重跑前面23个)。

另一个常见错误:

2024-06-15 14:25:11 ERROR SRR4567890: fastq-dump failed with code 137: Killed

代码137=128+9,表示被SIGKILL杀死,通常是内存不足。解决方案:
- 降低THREADS值(如从8降到4);
- 或在config.sh里加FASTQ_DUMP_OPTS="--mem 4G"限制单个fastq-dump进程内存上限。


5. 常见问题与排查技巧实录:那些让我熬夜到凌晨三点的Bug

以下是我过去两年用这套脚本处理超过12000个SRA条目时,遇到的TOP 5高频问题及独家解决方案。它们不在任何官方文档里,但能帮你省下至少20小时调试时间。

5.1 问题速查表

现象可能原因快速诊断命令解决方案
prefetch卡在Resolving...超10分钟DNS污染或NCBI CDN节点异常dig trace.ncbi.nlm.nih.gov +short看返回IP是否在国内(如114.114.114.114~/.ncbi/user-settings.mkfg里加/http/proxy/host = "127.0.0.1"/http/proxy/port = "8123"(需自建HTTP代理),或换DNS为223.5.5.5
fastq-dumperror while loading shared libraries: libcrypto.so.1.1macOS/Linux动态库版本冲突otool -L $(which fastq-dump)(macOS)或ldd $(which fastq-dump)(Linux)install_name_tool -change(macOS)或patchelf(Linux)修复库路径,或重装sra-toolkit
生成的FASTQ文件全是@SRRxxxxxx.1开头,不是@SAMPLE_X.1sample_list.txt编码不是UTF-8,或列分隔符不是Tabfile sample_list.txthexdump -C sample_list.txt | headiconv -f GBK -t UTF-8 sample_list.txt > tmp && mv tmp sample_list.txt转码;用sed 's/ \+/\t/g' sample_list.txt把空格转Tab
./fastq/里只有SRRxxxxxx.fastq.gz,没有_1/_2后缀sample_list.txtLibrary_Type写成了paired-end而非pairedawk -F'\t' '{print $3}' sample_list.txt | sort -u全局替换:sed -i 's/paired-end/paired/g' sample_list.txt
脚本运行后./fastq/为空,但./cache/里有.sra文件SKIP_EXISTING=true./fastq/里已有同名文件,但文件大小<1MBls -lh ./fastq/find ./fastq/ -size -1M删除小文件:find ./fastq/ -size -1M -delete,再重试

5.2 独家避坑技巧

技巧1:用--dry-run预演,避免误操作
--dry-run参数后,脚本不执行任何下载或转换,只打印将要运行的完整命令:

./sra-download.sh --dry-run

输出类似:

DRY RUN: prefetch --max-size 30G --verify --output-directory /data/project_x/sra_cache SRR1234567 DRY RUN: fastq-dump --split-files --gzip --outdir /data/project_x/atac_fastq --skip-technical --read-filter pass --threads 8 /data/project_x/sra_cache/SRR1234567.sra DRY RUN: mv /data/project_x/atac_fastq/SRR1234567_1.fastq.gz /data/project_x/atac_fastq/SAMPLE_A_1.fastq.gz

这能让你100%确认:路径对不对?参数对不对?重命名逻辑对不对?我在处理一个300+样本的项目前,必先--dry-run,花2分钟看50行命令,比跑1小时后发现全错了强百倍。

技巧2:--force-verify强制重校验已下载的.sra
有时你怀疑某个.sra文件损坏(比如fastq-dumpInvalid SRA file),但又不想重下几GB。脚本提供--force-verify

./sra-download.sh --force-verify SRR1234567

它会跳过下载,直接对./cache/SRR1234567.sra执行prefetch --verify --input-file ./cache/SRR1234567.sra,校验失败则删除该文件,下次运行自动重下。

技巧3:用--list-samples快速生成sample_list.txt骨架
如果你只有SraAccList.txt,但不知道每个SRA对应什么样本名,可以先用NCBI E-Utilities API批量获取元数据:

./sra-download.sh --list-samples SraAccList.txt > sample_list_skeleton.txt

它会调用esearch+esummary,输出:

SRR1234567 SRR1234567_paired paired gzip SRR2345678 SRR2345678_paired paired gzip

然后你用Excel打开sample_list_skeleton.txt,把第二列SRR1234567_paired手工改成SAMPLE_A,保存即可。这比一个个去NCBI网页复制快10倍。

技巧4:--cleanup-cache安全清理缓存
./cache/目录会越积越大。脚本提供--cleanup-cache,但它不是简单rm -rf ./cache,而是:
- 先扫描./fastq/里所有已成功生成的FASTQ文件;
- 对每个FASTQ,反向推导其来源SRA号(如SAMPLE_A_1.fastq.gzSRR1234567);
- 只删除./cache/不在任何FASTQ文件名中出现.sra文件;
- 最后留下./cache/SRR1234567.sra等正在使用的文件,确保下次运行无需重下。
命令:./sra-download.sh --cleanup-cache

5.3 性能调优实战:从3小时到22分钟

我曾用这套脚本处理一个84样本的scRNA-seq项目(每个SRA平均8GB),初始配置THREADS=4,耗时3小时12分钟。通过以下三步优化,压缩到22分钟:

Step 1:IO瓶颈定位
iostat -x 1监控,发现%util长期100%,await超200ms,说明磁盘是瓶颈。解决方案:把CACHE_DIRFASTQ_DIR都指向同一块NVMe SSD(/mnt/nvme/sra/),避免HDD和SSD间拷贝。

Step 2:内存带宽释放
fastq-dump默认用全部内存解压。用htop看,8个进程共占24GB内存,触发系统swap。在config.sh里加:

FASTQ_DUMP_OPTS="--mem 3G"

限制每个进程最多用3GB,8个共24GB,刚好占满64GB内存的37.5%,避免swap。

Step 3:并发策略重构
原脚本是“prefetch串行→fastq-dump并行”。改为“prefetch分批并行+fastq-dump流水线”:
- 把84个SRA分成4组(每组21个);
- 每组启动一个prefetch进程(parallel -j 4);
- 每组prefetch完成后,立即启动该组的fastq-dump--jobs 4);
脚本内置--batch-size 21参数支持此模式。最终耗时:22分钟,提速8.3倍。

最后分享一个小技巧:处理超大项目前,先用./sra-download.sh --dry-run | wc -l算出总命令数,再除以你的THREADS,就能预估fastq-dump阶段的理论最短时间(单位:秒)。比如84个SRA,THREADS=8fastq-dump平均每个耗时90秒,则理论时间≈84/8×90=945秒≈15.75分钟。实际22分钟,说明IO和内存还有优化空间——这就是工程化的魅力:一切可测量,一切可优化。

本文还有配套的精品资源,点击获取

简介:一套开箱即用的命令行工具,专为批量获取NCBI SRA数据库中的原始测序数据设计。核心脚本sra-download.sh读取SraAccList.txt里的SRA编号(如SRR1234567),再对照sample_list.txt中的样本名,自动创建带命名逻辑的输出目录结构,下载完成后直接生成标准FASTQ文件(支持gzip压缩)。整个流程支持一次处理几十到几百个SRA条目,无需人工干预,不依赖图形界面。已内置示例数据(含ATAC_N1_1.fastq.gz等真实FASTQ)、预配置的列表模板和完整README说明,还包含重复校验所需的文件结构参考。运行前需在Linux或macOS系统中安装sra-toolkit 3.0.0及以上版本,并完成prefetch初始化配置。所有操作均通过终端执行,适合生信分析前的数据准备环节,可无缝衔接后续质控、比对或组装流程。


本文还有配套的精品资源,点击获取

http://www.zskr.cn/news/1447177.html

相关文章:

  • 7.4V锂电池充电IC芯片,可实现PD快充2.4A的方案分享
  • 5分钟掌握跨文件Excel搜索:终极批量查询方案
  • Tinkercad制作SpaceX火箭发射动画:零门槛3D建模与可视化编程实践
  • 基于LM3915芯片与LED灯带打造动态音频VU表:从原理到实践
  • 为什么 Superpowers 的 brainstorming skill 坚决不写代码?我翻了它的源文件
  • 保姆级教程:在Ubuntu 20.04上为AirSim ROS包添加自定义控制接口(以角速度推力为例)
  • Arduino机械臂DIY指南:从零搭建桌面级机器人助手
  • Arduino步进电机与旋转编码器实现手摇曲柄远程控制方案
  • 5分钟掌握kill-doc:终极免费文档下载自动化工具指南
  • QMCDecode终极指南:如何在Mac上免费解锁QQ音乐加密格式,实现跨平台自由播放
  • 我的学习情况
  • 10.Linux笔记:应用编程开始、文件IO
  • 集团首都公报:武汉市放飞炬人产业引导基金有限责任公司财政处批准 创设 集体组织债 资本市场种品 将来为农村集体经济组织和乡镇经济管理提供资本来源和货币供应。
  • 惠城黄金回收哪家强?惠奢汇(惠城旗舰店)等你来选! - 生活测评小能手
  • 基于Arduino Leonardo/Micro打造12轴USB摇杆控制器:从HID协议到实战
  • Python 从不起眼到AI时代的王者之路
  • ComfyUI-VideoHelperSuite视频处理模块防御性编程实践与零除错误修复
  • 计算机软件转 IC 验证(Design Verification, DV),学习路径
  • 基于Arduino Nano RP2040的DIY可编程USB游戏手柄全流程开发指南
  • 基于Arduino与超声波传感器的智能扫地机器人V2.0设计与实现
  • 大量频繁数据更新表格不卡顿的核心原因(通用原理 + 对应上套代码的设计)
  • 【CGLIB】在你熟悉的 Flink、ShardingSphere-JDBC 等组件中,是否存在 CGLIB 的使用痕迹?如何排查?
  • Arduino超声波测距系统:从传感器原理到社交距离监测器实战
  • 办公用的免费证件照制作入口有什么?2026职场人必备免费入口 - 科技大爆炸
  • 天赐范式第61天:为“雨”平反——从一次大模型“服务器繁忙”看 PDE 求解器的代数独立性——何以解忧,唯有杜康~
  • 用Python写个脚本,自动帮你算出下一个“黄道吉日”(附完整代码)
  • 2026 濮阳本地口碑好的GEO优化公司,豆包AI搜索排名推荐榜(综合实力TOP5) - 星际AI
  • 2026年武汉离婚律师推荐指南:从财产分割到抚养权全面解析 - 本地品牌推荐
  • 2026年GEO源码部署公司深度横评与权威选型白皮书 - 品牌报告
  • 基于Arduino与MLX90614的非接触式智能测温仪设计与实现