Linux 下 BWA 与 SAMtools 的安装与使用详解

在高通量测序(NGS)数据分析领域,将测序得到的短序列(Reads)回贴到参考基因组上是几乎所有下游分析(如变异检测、基因表达定量等)的关键第一步。BWA(Burrows-Wheeler Aligner)和 SAMtools 是这一流程中最核心、最广泛使用的工具集之一。

  • BWA: 一款非常高效的短序列比对软件,它利用 Burrows-Wheeler 变换(BWT)算法,能够在保证准确性的同时,快速地将大量短序列比对到参考基因组上。
  • SAMtools: 一个用于处理 SAM(Sequence Alignment/Map)和 BAM(Binary Alignment/Map)格式比对文件的工具集。BAM 是 SAM 的二进制压缩版本。SAMtools 提供了查看、排序、索引、合并、提取比对数据等强大功能,是操作比对结果的“瑞士军刀”。

本文将提供一份从零开始的详细指南,涵盖在 Linux 环境下 BWA 和 SAMtools 的编译安装、基本使用方法、常用命令组合以及最佳实践。

目录#

  1. 环境准备
  2. 安装 BWA
    1. 使用源码编译安装(推荐)
    2. 使用 Conda 安装(更简单)
  3. 安装 SAMtools
    1. 使用源码编译安装
    2. 使用 Conda 安装
  4. BWA 的使用
    1. 准备工作:为参考基因组建立索引
    2. 序列比对:bwa mem 算法
    3. 其他算法简介
  5. SAMtools 的使用
    1. 格式转换:SAM 与 BAM 互转
    2. 排序:按坐标或名称排序
    3. 索引:建立快速检索索引
    4. 查看:快速浏览比对结果
    5. 过滤与统计
  6. 完整流程示例
  7. 最佳实践与常见问题
  8. 总结
  9. 参考资料

环境准备#

在开始之前,请确保你的 Linux 系统满足以下条件:

  • 操作系统: 常见的 Linux 发行版,如 Ubuntu, CentOS, Red Hat 等。
  • 编译器: 需要安装 C 编译器(如 gcc)和 make 工具。
    • 在 Ubuntu/Debian 上:sudo apt-get update && sudo apt-get install build-essential
    • 在 CentOS/RHEL 上:sudo yum groupinstall "Development Tools"
  • 依赖库: SAMtools 需要 zlibncurses 开发库。
    • 在 Ubuntu/Debian 上:sudo apt-get install zlib1g-dev libncurses5-dev
    • 在 CentOS/RHEL 上:sudo yum install zlib-devel ncurses-devel
  • 包管理器(可选): 推荐安装 Conda(Miniconda 或 Anaconda),它可以极大地简化生物信息学软件的安装和管理。

安装 BWA#

使用源码编译安装(推荐)#

这种方式能获得最新的版本和最好的性能控制。

  1. 下载源码: 访问 BWA 在 GitHub 的 发布页面,找到最新的稳定版源码包(如 bwa-0.7.17.tar.bz2)。使用 wget 下载。

    wget https://github.com/lh3/bwa/releases/download/v0.7.17/bwa-0.7.17.tar.bz2
  2. 解压并编译

    tar -xjvf bwa-0.7.17.tar.bz2
    cd bwa-0.7.17
    make

    编译成功后,当前目录会生成一个名为 bwa 的可执行文件。

  3. 添加到环境变量(可选但推荐): 为了能在任何目录下直接使用 bwa 命令,可以将其移动到系统路径,例如 /usr/local/bin(需要 root 权限):

    sudo cp bwa /usr/local/bin/

    或者,将其添加到你的个人 ~/.bashrc 文件中:

    echo 'export PATH=$PATH:/path/to/your/bwa-0.7.17' >> ~/.bashrc
    source ~/.bashrc
  4. 验证安装

    bwa

    如果安装成功,会输出 BWA 的帮助信息。

使用 Conda 安装(更简单)#

如果你已经安装了 Conda(如 Bioconda 频道),安装过程会非常简单。

  1. 添加 Bioconda 频道(如果尚未添加):

    conda config --add channels bioconda
    conda config --add channels conda-forge
  2. 创建并激活一个虚拟环境(推荐,用于管理依赖):

    conda create -n ngs-tools bwa
    conda activate ngs-tools
  3. 直接安装 BWA

    conda install bwa

    Conda 会自动解决所有依赖关系。

  4. 验证安装

    bwa

安装 SAMtools#

安装过程与 BWA 类似。

使用源码编译安装#

  1. 下载源码: 访问 SAMtools 的 官方网站 或 GitHub 页面下载源码。

    wget https://github.com/samtools/samtools/releases/download/1.17/samtools-1.17.tar.bz2
  2. 解压、配置并编译

    tar -xjvf samtools-1.17.tar.bz2
    cd samtools-1.17
    ./configure --prefix=/your/installation/path  # 如果不指定--prefix,默认安装到/usr/local
    make
    sudo make install  # 如果配置了prefix且你有写入权限,可能不需要sudo

    --prefix 参数指定安装目录。

  3. 验证安装

    samtools

使用 Conda 安装#

在之前创建的 ngs-tools 环境中,直接安装:

conda activate ngs-tools
conda install samtools

验证安装:samtools

BWA 的使用#

准备工作:为参考基因组建立索引#

在进行比对之前,必须先为参考基因组(FASTA 格式,如 hg19.fa)建立 BWA 索引。这是一个一次性但计算密集的步骤。

命令

bwa index /path/to/reference/genome.fa

常见选项

  • -a: 指定索引算法。对于大型基因组(如人类基因组),使用默认的 bwtsw 算法即可。对于小型基因组(如细菌),可以使用 is 算法。
    bwa index -a bwtsw genome.fa

索引完成后,会生成多个以 genome.fa 为前缀的索引文件(如 .amb, .ann, .bwt, .pac, .sa)。后续比对时需要的是原始的 genome.fa 文件,BWA 会自动识别这些索引文件。

序列比对:bwa mem 算法#

bwa mem 是当前最推荐的算法,尤其适用于 Illumina 的 70bp-1Mbp 的序列。

基本语法

bwa mem [options] <reference.fa> <read1.fq> [<read2.fq>] > output.sam
  • reference.fa: 已建立索引的参考基因组路径。
  • read1.fq / read2.fq: 测序 reads 文件。如果是单端测序,只提供一个文件;如果是双端测序,提供两个文件。
  • > output.sam: 将标准输出重定向到 output.sam 文件。

示例

  1. 单端测序比对

    bwa mem -t 8 human_g1k_v37.fa sample_single.fq > sample_se.sam
  2. 双端测序比对

    bwa mem -t 8 human_g1k_v37.fa sample_1.fq sample_2.fq > sample_pe.sam

重要选项

  • -t <INT>: 指定使用的线程数,可以显著加快比对速度。例如 -t 8 表示使用 8 个 CPU 核心。
  • -R <STR>: 设置 SAM 文件头中的 @RG 读组信息,非常重要!它包含样本、文库、平台等信息,是下游分析(如 GATK 变异检测)所必需的。格式为 '@RG\tID:foo\tSM:bar\tLB:library1\tPL:ILLUMINA'
    • ID: 读组唯一标识符。
    • SM: 样本名。
    • LB: 文库名。
    • PL: 测序平台(如 ILLUMINA, PACBIO)。
    • 最佳实践示例
      bwa mem -t 8 -R '@RG\tID:Sample1\tSM:Sample1\tLB:LIB1\tPL:ILLUMINA' \
        human_g1k_v37.fa sample_1.fq sample_2.fq > sample_with_rg.sam
  • -M: 将较短的 split hits 标记为次要比对,方便 Picard 兼容。

其他算法简介#

  • bwa aln / bwa sampe / bwa samse: 这是 BWA 的旧版算法。对于非常短的序列(< 70bp)可能比 mem 更准确,但现在已较少使用。
  • bwa bwasw: 用于比对长序列,如 PacBio 或 Oxford Nanopore 测序数据。

SAMtools 的使用#

BWA 产生的 SAM 文件是文本格式,体积庞大,不利于存储和快速处理。SAMtools 主要用于将其转换为二进制 BAM 格式并进行后续处理。

格式转换:SAM 与 BAM 互转#

将 SAM 转换为 BAM(view 命令)

samtools view -@ 8 -Sb input.sam > output.bam
  • -S: 自动识别输入格式(可省略,新版本已默认)。
  • -b: 输出为 BAM 格式。
  • -@: 指定线程数,加快处理速度。

将 BAM 转换为 SAM

samtools view -@ 8 -h input.bam > output.sam
  • -h: 在输出中包含 SAM 头信息(以 @ 开头的行),非常重要!没有这个选项,头信息会被丢弃。

排序:按坐标或名称排序#

比对后的文件通常是无序的。按基因组坐标排序是许多下游分析(如变异检测)的必要步骤。

按坐标排序(sort 命令)

samtools sort -@ 8 -o sorted.bam input.bam
  • -@: 指定线程数。
  • -o: 指定排序后的输出文件名。
  • 默认按坐标排序。排序后会生成 sorted.bam

按 reads 名称排序

samtools sort -@ 8 -n -o name_sorted.bam input.bam
  • -n: 按 reads 名称排序,在某些特定分析中会用到。

索引:建立快速检索索引#

对于坐标排序后的 BAM 文件,必须建立索引(生成 .bai 文件),才能实现快速随机访问(如查看特定区域的比对情况)。

为 BAM 文件建立索引(index 命令)

samtools index sorted.bam

这会生成一个 sorted.bam.bai 索引文件。

查看:快速浏览比对结果#

查看 BAM 文件头信息

samtools view -H sorted.bam

查看特定基因组区域的比对情况: 需要先建立索引。

samtools view sorted.bam chr1:1000000-1005000

使用 tview 进行交互式查看(非常直观):

samtools tview sorted.bam reference.fa

过滤与统计#

过滤比对结果: 使用 view 命令的 -f(保留符合标志的)和 -F(过滤掉符合标志的)选项。

  • 提取唯一比对的 reads(常见的过滤条件):
    samtools view -@ 8 -b -F 4 -q 1 input.bam > unique_mapped.bam
    • -F 4: 过滤掉未比对的 reads(SAM 标志位 4 表示未比对)。
    • -q 1: 只保留 Mapping Quality >= 1 的 reads,通常可以过滤掉重复和低质量比对。

统计比对信息(flagstat 命令): 快速生成比对的统计报告,非常有用。

samtools flagstat sorted.bam

输出会显示总 reads 数、比对上的 reads 数、 properly paired 的 reads 数等。

完整流程示例#

下面是一个从原始 fastq 文件到最终排序去重 BAM 文件的完整、高效的命令行流程(使用管道,避免生成中间文件)。

# 假设参考基因组是 ref.fa,并且已建立索引
# 双端测序文件: read_1.fastq, read_2.fastq
 
# 1. 使用BWA进行比对,并直接通过管道传递给samtools转换为BAM
# 2. 对BAM文件按坐标排序
# 3. 将排序后的BAM文件输出到 sorted.bam
bwa mem -t 8 -R '@RG\tID:MySample\tSM:MySample\tPL:ILLUMINA' \
  ref.fa read_1.fastq read_2.fastq | \
samtools view -@ 4 -Sb - | \
samtools sort -@ 4 -o sorted.bam -
 
# 为最终的BAM文件建立索引
samtools index sorted.bam
 
# 生成比对统计报告
samtools flagstat sorted.bam > flagstat.txt

解释

  • |(管道): 将上一个命令的输出直接作为下一个命令的输入,省去了生成巨大 SAM 文件的步骤,节省磁盘 I/O 和时间。
  • -: 在管道中代表标准输入或标准输出。

最佳实践与常见问题#

  1. 始终使用 -R 参数: 在 bwa mem 中设置读组信息,这是下游分析的基础。
  2. 使用多线程: BWA(-t)和 SAMtools(-@)都支持多线程,能极大提升处理速度。
  3. 使用管道: 将 bwa mem | samtools view | samtools sort 串联起来,避免生成巨大的中间 SAM 文件。
  4. 质量控制: 在比对前,建议先使用 FastQC 对原始 fastq 文件进行质量检查,并使用 Trimmomatic 或 fastp 等进行质量控制和过滤。
  5. 标记重复: 排序后的 BAM 文件通常还需要使用 Picard 或 SAMtools 的 markdup 命令来标记 PCR 重复,这是变异检测前的标准步骤。
    samtools markdup -@ 8 sorted.bam marked_duplicates.bam
  6. 常见错误
    • BWA 报错 "fail to locate the index": 确保参考基因组文件(.fa)和它的索引文件(.amb, .bwt 等)在同一个目录下,并且 BWA 命令中指定的路径正确。
    • SAMtools 报错 "samtools index: failed to create index": 确保 BAM 文件是已经按坐标排序过的。未排序的 BAM 文件不能建立索引。

总结#

BWA 和 SAMtools 是 NGS 数据分析基石般的工具。通过本文的指南,你应该已经掌握了如何在自己的 Linux 系统上安装这两个工具,并理解了从序列比对到生成排序、索引 BAM 文件的完整流程。记住核心步骤:建立索引 -> BWA比对 -> SAM转BAM -> 排序 -> 建索引。熟练运用这些命令,结合多线程和管道技巧,你将能高效地处理海量的测序数据。

参考资料#

  1. BWA 官方手册man bwa李恒的BWA页面
  2. SAMtools/htslib 官方文档man samtoolshtslib.org
  3. SAM 格式说明SAM Format Specification
  4. Biocondahttps://bioconda.github.io/
  5. GATK Best Practiceshttps://gatk.broadinstitute.org/hc/en-us/sections/360007226651-Best-Practices-Workflows (了解读组信息的重要性)