samtools bam2fq(或samtools fastq)一次只能处理一个 BAM,但它会 自动把双端测序的 R1 和 R2 拆成两个 FASTQ,只要你在命令里 指定输出文件名模板。

samtools fastq \
-1 ${id}_1.fq \
-2 ${id}_2.fq \
-s ${id}_singleton.fq \
${id}.bam
-1:R1 文件-2:R2 文件-s:不成对的 reads(singleton)samtools fastq一次性拆 R1/R2(如上命令);samtools bam2fq(现多写作 samtools fastq)在大多数场景下 I/O 密集、计算量低,单线程即可跑满磁盘带宽,再增加线程也不会明显提速;若您的 BAM 文件在 机械硬盘或网络文件系统,它往往 受限于磁盘读写而非 CPU。因此:
cat回去;不过要注意 FASTQ 顺序与 RG 一致性。软件/流程 | 提速要点 | 速度对比* | 适用场景 |
|---|---|---|---|
Parabricks bam2fq | GPU + 多线程解码 | 实测 3–6×↑ | 有 NVIDIA GPU(V100/A100)节点;一次性重对齐到新版参考基因组时最划算 |
bazam | Java 并行 + 内存映射 | 比 samtools 快 1.5–2×↑;线程越多优势越大 | 无 GPU,但服务器 CPU 核数多(>16 核)、内存充足 |
sambamba | C++ 并行 I/O | 与 bazam 接近,略快于 samtools | 已用 sambamba 做排序/去重,可保持工具链一致 |
samtools collate + GNU parallel | 先按 QNAME 分块再并行转换 | 线性加速取决于并发核数 | 大量中小 BAM 文件批处理;无需额外安装软件 |
以 30× WGS BAM(≈100 GB)→ paired-end FASTQ 为例,单路 NVMe 环境。
samtools fastq -1 R1.fq.gz -2 R2.fq.gz即可;别加线程,把 CPU 留给下游比对。
若磁盘慢,可 export TMPDIR=/ssd把临时 gzip 文件放到本地 SSD。fq2bam重比对至 hg38/CHM13。--threads 16以上能再快 1–2 倍;注意内存占用(约 2–4 GB)。磁盘够快时
samtools fastq已足够;GPU 选 Parabricks,CPU 核多选 bazam/sambamba,批量小文件用 GNU parallel即可把速度压榨到极限。
samtools fastq**本身不会自动输出 .gz**,它默认写出 纯文本 FASTQ。
但你可以 用管道直接压:
samtools fastq \
-1 >(bgzip -c > ${id}_1.fq.gz) \
-2 >(bgzip -c > ${id}_2.fq.gz) \
-s >(bgzip -c > ${id}_singleton.fq.gz) \
${id}.bam
bash的 进程替换>(...);bgzip来自 htslib(与 samtools 同套件),多线程可用 -@ 4;
samtools fastq原生不写.gz,用>(bgzip -c > xxx.fq.gz)管道即可边转边压,速度几乎无损,还省磁盘。
值得注意的是,如果BAM 没有按 QNAME 排序(或至少没有按 flag & 0x40 / 0x80把 R1/R2 相邻存放)时,samtools fastq会把 找不到配对伙伴的 read 统统丢进 singleton 文件,于是你看到:
singleton.fq巨大,而_1.fq、_2.fq很小甚至为空。
samtools view -H ${id}.bam | grep SO:
SO:queryname→ 已按 QNAME 排序,可以正确拆 R1/R2;SO:coordinate或 无 SO 行→ 只是坐标排序或未排序,必须重排。临时排序(只排你要的 region 或全部)
samtools sort -n \
-o ${id}.qsort.bam \
-@ 4 \
${id}.bam
-n= 按 QNAME排序;内存不足可加 -m 2G控制每线程内存。
再用排序后的 BAM 跑 samtools fastq
samtools fastq \
-1 ${id}_1.fq.gz \
-2 ${id}_2.fq.gz \
-s ${id}_singleton.fq.gz \
${id}.qsort.bam
此时 绝大多数 reads 会进入 R1/R2,singleton 只含真正的单端或孤儿读段。
但是呢,上面的 samtools sort 本身就非常耗时,而且会输出一个更大的bam文件给你,耗费磁盘空间。
singleton.fq暴涨 99% 是因为 BAM 没按 QNAME 排序;samtools sort -n重排后再跑fastq,R1/R2 就能正常拆分,singleton 瞬间缩小到真实孤儿读段。
所以,这个时候,换高级工具是最好的选择!
比如,我看到了2020的文章《Potential prognostic impact of EBV RNA‐seq reads in gastric cancer: a reanalysis of The Cancer Genome Atlas cohort》对TCGA‐STAD 的 BAM files were converted into FASTQ with bam2fastq (https://github.com/jts/bam2fastq).
同样的,让人工智能大模型梳理一下 这个bam2fastq工具的来龙去脉,使用方法:
sort -n的磁盘与时间开销。-t 8就能跑满 CPU,通常比 samtools 单线程方案快 2–4×。-m可设定哈希表大小(默认 512 MB),大样本也能流式处理;若内存实在不够,会降级为“两次遍历”模式。-o %_1.fq.gz %_2.fq.gz -s %_s.fq.gz一次给模板,自动生成 gz 文件;也可输出 interleaved 或纯 stdout。cram://路径,直接解 CRAM 转 FQ,省去先转 BAM 步骤。--no-supplementary等选项,默认全输出。-m 4G)sort -n**(例如临时抽一个 region 就要立刻还回 FastQ);
✔ 磁盘 I/O 吃紧,想省掉排序中间文件;
✔ CRAM 归档仓库,需要直接批量倒回 FastQ 做重新比对;
✔ 大型 Panel/WES/WGS 自动化管线,追求高吞吐;
✘ 内存极端受限(< 1 GB)且 BAM 极大,需要接受两次遍历降级或仍用 samtools。# 1. 编译(依赖 zlib,可选 libdeflate 加速)
git clone --recursive https://github.com/jts/bam2fastq
cd bam2fastq
make
# 2. 使用
./bam2fastq -t 8 \
-o sample_%_1.fq.gz \
-o sample_%_2.fq.gz \
-s sample_%_s.fq.gz \
input.bam
输出即 gz 压缩的 R1/R2/singleton,可直接喂给 OptiType、Kallisto、BWA-MEM2 等下游。
-m留余量即可;太大只会多占内存不会提速。input.cram同目录下要有 .crai和 ref.fa,否则会报错。samtools view -f 0x2预先过滤。zlib即可。--preserve-order(会稍慢一点)。一句话总结 bam2fastq = “免排序 + 多线程压缩” 的 BAM→FastQ 专用加速器;在 不想 sort -n、磁盘紧、追求吞吐的场景下,用它往往 比 samtools 快几倍,而安装与命令都极简单,值得一试。
conda install yuxiang::bam2fastq
你看到的这份说明书对应的是 “老版本” bam2fastq(v1.0/v1.1.0,2012 年左右由 Illumina GitHub或早期 Debian 包发布),它和我前面介绍的 jts/bam2fastq(2020+ 版)完全是两个分支:
项目 | 你手头的 v1.1.0(旧) | jts/bam2fastq(新) |
|---|---|---|
维护方 | Illumina / 早期社区 | Justin Chu(jeremy liu) |
最后更新 | 2012–2014 | 2023+ |
核心目标 | 仅把 BAM → FASTQ(单线程、无压缩) | 免排序 + 多线程 gzip |
输出压缩 | 无,必须自己 ` | gzip` |
并行 | ❌ 纯单线程 | ✅ -j多线程 |
内存优化 | 无,逐条读 | 哈希表配对,内存换速度 |
是否需排序 | 必须 QNAME 排序 | 无需排序 |
模板占位符 | %= lane;#= _1/_2 | %1%2%s更灵活 |
s_%#_sequence.txt
例:若 BAM lane=5 → s_5_1_sequence.txt(R1) s_5_2_sequence.txt(R2)# 1. 先确保 BAM 已按 QNAME 排序!
samtools sort -n -o qsort.bam original.bam
# 2. 旧版 bam2fastq
bam2fastq -o my_%#_sequence.txt -f qsort.bam
输出:
my_1_sequence.txtmy_2_sequence.txt(纯文本,无压缩)
开关 | 含义 |
|---|---|
--aligned/ --no-aligned | 只要 mapped / 不要 mapped |
--unaligned/ --no-unaligned | 只要 unmapped / 不要 unmapped |
--filtered/ --no-filtered | 只要 QC-fail / 不要 QC-fail |
bam2fastq -o tmp_%#_sequence.txt qsort.bam && gzip tmp_*_sequence.txt
samtools sort -n先排序;gzip;你看到的是 “Illumina 旧版” bam2fastq v1.1.0,功能简单、必须 QNAME 排序、无压缩无并行; 想“开箱即跑”就选 新版 jts/bam2fastq,两者命令不兼容,注意别混用。
那么,这样的samtools fastq进行格式转化的时候,会过滤bam文件吗?
人工智能大模型告诉我:samtools fastq的默认行为是 “几乎什么都不滤”,它只负责把 BAM/CRAM 里的 所有序列记录重新变回 FASTQ 格式,以便你重新比对或做其他分析。具体规则如下:
过滤维度 | 是否默认剔除 | 说明 / 开关 |
|---|---|---|
PCR duplicate(0x400) | ❌ 保留 | 除非你自己加 -F 0x400 |
QC 失败(0x200) | ❌ 保留 | 除非你自己加 -F 0x200 |
比对失败(0x4) | ❌ 保留 | 除非你自己加 -F 0x4 |
SUPPLEMENTARY(0x800) | ❌ 保留 | 除非你自己加 -F 0x800 |
SECONDARY(0x100) | ✅ 剔除 | 二级比对默认不出现在输出 |
FLAG 为 0 的未比对 read | ✅ 输出 | 完全保持原样 |
FLAG 同时标 1 和 2 的孤儿读 | ✅ 输出到 -s文件 | 仅按配对逻辑拆文件,不滤 |
因此:
如果你想 去掉 PCR dup再出 FASTQ**,需要手动加 flag 过滤:
samtools view -F 0x400 -b input.bam | \
samtools fastq -1 R1.fq.gz -2 R2.fq.gz -s singleton.fq.gz -
如果想 只保留 proper pair:
samtools view -f 0x2 -b input.bam | \
samtools fastq ...
如果 什么都不想滤,直接:
samtools fastq -1 R1.fq.gz -2 R2.fq.gz -s singleton.fq.gz input.bam
这就是 重新比对时最常用的写法,能保证 所有原始序列都参与新一轮比对。
一句话总结
samtools fastq默认不会剔除 PCR duplicate、低质量或未比对 read;它只默认跳过 SECONDARY对齐。任何额外过滤都要自己用 samtools view -F / -f先做完再管道进 fastq。
下面给出 bam2fastq(GitHub 版,https://github.com/jts/bam2fastq)的 “一页纸” 完整命令手册,所有参数均结合源码与社区实测整理,可直接收藏备查。
一、命令骨架
bam2fastq [options] input.bam [input2.bam ...]
支持 批量输入多个 BAM/CRAM;结果文件名由 -o模板决定。
二、常用参数一览表
参数 | 默认值 | 说明 |
|---|---|---|
-o STRING | 必填 | 输出文件 模板,用 %或 #占位符区分 R1/R2/singleton;见下方“模板规则”。 |
-j INT | 0 | 线程数;0=自动检测,推荐设为物理核心数。 |
-c INT | 1 | gzip 压缩等级 1–9;1 速度最快、体积稍大;与 -u互斥。 |
-u | 关闭 | 不压缩输出,文件名为 .fq,可省 CPU。 |
-m INT | 512 | 哈希表内存上限(MB);每 1 亿对 read ≈ 300–400 MB,给大点可减少二次遍历。 |
--interleaved | 关闭 | 把 R1/R2 交叉写进同一个文件(常用于 Interleaved 管道)。 |
--no-singleton | 关闭 | 丢弃孤儿读段;若只想拿回成对 read,可省一个文件。 |
--stdout | 关闭 | 所有序列写向 stdout(可与管道连用,不可与 -o同用)。 |
-h/ --help | — | 打印帮助并退出。 |
--version | — | 显示版本。 |
三、模板规则(-o怎么写) 模板里出现 一个 %或 #会被替换成:
占位符 | 替换内容 |
|---|---|
%1或 #1 | R1 文件名 |
%2或 #2 | R2 文件名 |
%s或 #s | singleton 文件名 |
示例
-o sample_% # 生成 sample_1.fq.gz sample_2.fq.gz sample_s.fq.gz
-o /data/%_L001.fq # 可带目录,生成 /data/1_L001.fq.gz …
四、典型场景一行命令
bam2fastq -j 8 -c 4 -o sample_% input.bam
bam2fastq -j 2 --no-singleton -o clean_% input.bam
bam2fastq -j 6 -o % data.cram # 自动找 ref.fa
bam2fastq -j 16 -o % *.bam # 依次处理多个文件,各自独立命名
五、输出文件与下游兼容性
.fq.gz),可与 bwa-mem2、bowtie2、Kallisto、OptiType等直接对接;sed或 --interleaved后统一处理。六、注意事项 & 常见坑
samtools view -F滤掉 FLAG,会导致配对失败。-m。brew install zlib后即可 make。--preserve-order(稍慢)。一张表 + 一行命令 + 一句话总结
bam2fastq = “免排序 + 多线程 gzip” 的 BAM→FastQ 专用加速器;只要给
-o %,任何未排序 BAM 都能几分钟内吐出 gz 压缩的 R1/R2/singleton,是 samtools 在吞吐敏感场景下的优秀替代品。
也就是说bam2fastq可以对bam文件直接输出fq文件,但是,fq文件这个时候是文本文件,并没有压缩, 会耗费大量的磁盘空间。而samtools fastq这个命令需要首先对bam文件进行排序。都有缺点了,大家有什么更好的方法吗?
当然了,参考下面的博客也可以获得跟人工智能大模型同样的知识:
https://www.metagenomics.wiki/tools/samtools/converting-bam-to-fastq