第4章 bcftools工具入门:安装、基本命令与使用示例

做VCF一致性评估,bcftools是绕不开的核心工具。说白了,它就是处理VCF/BCF文件的瑞士军刀。我最早接触它的时候还是1.9版本,现在都到1.19了,但核心命令的思路一直没变。

这一章我们就把bcftools装好,再把最常用的几个命令摸透。你跟着我做一遍,后面分析多批次VCF时会顺手很多。

4.1 安装bcftools

安装方式有两种,我分别说一下。

4.1.1 从源码编译(推荐)

我个人习惯用源码编译,因为能控制依赖版本。你别怕编译,几步就完事。

# 下载源码
wget https://github.com/samtools/bcftools/releases/download/1.19/bcftools-1.19.tar.bz2
tar -xjf bcftools-1.19.tar.bz2
cd bcftools-1.19

# 配置与编译
./configure --prefix=/usr/local/bcftools
make -j4
make install

# 加入环境变量
echo 'export PATH=/usr/local/bcftools/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
注意:编译依赖htslib库。如果报错说找不到zlib,先装一下zlib1g-dev。

4.1.2 用包管理器安装

如果你在Ubuntu/Debian上图省事,可以用apt直接装。但我建议别用这个版本做生产分析,因为包管理器里的版本通常落后一两年。

sudo apt update
sudo apt install bcftools

# 验证安装
bcftools --version

4.1.3 验证安装

装完之后跑一下版本号。看到类似下面的输出,就算成了。

bcftools --version
bcftools 1.19
Using htslib 1.19
Copyright (C) 2024 Genome Research Ltd.
我的经验:安装后最好跑一遍内置测试数据。用 bcftools test 命令就能生成一个样例VCF,用来验证环境。

4.2 三个核心命令:view、query、stats

bcftools有几十个子命令,但做一致性评估最常用就是这三个。我按使用频率排个序。

命令用途我常用的场景
viewVCF的查看、过滤、转换提取特定样本、按质量过滤
query自定义格式输出字段提取GT、DP做统计分析
stats生成质量统计摘要对比多批次数据质量

4.2.1 view命令

view是最基础的命令。它能把VCF转成文本看,也能做各种过滤。我平时用它80%的场景就是“看一眼数据长什么样”。

# 查看前10行
bcftools view input.vcf.gz | head -20

# 只看变异位点(过滤掉参考位点)
bcftools view -v snps input.vcf.gz

# 按样本提取
bcftools view -s sample1,sample2 input.vcf.gz

# 按区域提取
bcftools view -r chr1:100000-200000 input.vcf.gz

嗯,这里要注意:输出的格式默认是VCF。如果你想转成BCF(二进制格式),加个 -Ob 参数就行。BCF读起来快很多。

4.2.2 query命令

query是格式化输出神器。它可以把VCF里的信息按照你指定的顺序和格式打出来。我当时第一次用这个命令的时候,就觉得“终于不用写脚本解析VCF了”。

# 输出染色体、位置、参考碱基、突变碱基
bcftools query -f '%CHROM\t%POS\t%REF\t%ALT\n' input.vcf.gz

# 输出样本的基因型(GT)和测序深度(DP)
bcftools query -f '%CHROM\t%POS\t%GT\t%DP\n' -s sample1 input.vcf.gz

# 用列表形式输出所有样本的GT
bcftools query -l input.vcf.gz  # 先看样本名
bcftools query -f '%CHROM\t%POS\t[\t%GT]\n' input.vcf.gz
避坑指南:我曾经在提取DP字段时,忘记有些位点的DP是缺失值("."),结果统计平均深度时全变成NaN。后来在query命令里加了条件判断:%DP[\t. %DP] 做默认值处理。

4.2.3 stats命令

stats用来生成VCF的统计摘要。它是你评估VCF质量的第一道窗口。我每拿到一批新数据,第一件事就是跑一遍stats。

# 生成统计
bcftools stats input.vcf.gz > stats.txt

# 可以用plot-vcfstats直接出图(需要python和matplotlib)
plot-vcfstats -p output_dir/ stats.txt

stats输出的内容很丰富。我重点看这几个指标:

  • SNP数量 vs Indel数量(正常比例应该在10:1到20:1之间)
  • Ti/Tv比率(全基因组大约2.0-2.1,全外显子大约2.8-3.0)
  • 缺失率(这个后面做一致性评估时特别关键)

4.3 实战:用bcftools跑一个完整的质检流程

理论知识说完了,我带你走一遍实际项目中的典型流程。假设你拿到了一个批次的三例样本VCF,想做快速质检。

4.3.1 数据准备

我先用bcftools test生成一个演示数据。这样你也能跟着跑。

# 生成演示数据
bcftools test > test_samples.vcf

# 压缩并建立索引(标准做法)
bgzip test_samples.vcf
tabix -p vcf test_samples.vcf.gz

4.3.2 查看基本信息

# 看样本名
bcftools query -l test_samples.vcf.gz

# 看有几个位点
bcftools view -H test_samples.vcf.gz | wc -l

# 看变异类型分布
bcftools view -H test_samples.vcf.gz | awk '{print $4"\t"$5}' | sort | uniq -c

4.3.3 质量过滤

实际项目中我通常会把质量很低的位点筛掉。标准做法是保留QUAL>30、缺失率<20%的位点。

# 按质量过滤
bcftools view -i 'QUAL>30 && F_MISSING<0.2' \
  test_samples.vcf.gz \
  -Oz -o filtered.vcf.gz

# 重新索引
tabix filtered.vcf.gz

4.3.4 生成统计报告

# 过滤前后对比
bcftools stats test_samples.vcf.gz > raw_stats.txt
bcftools stats filtered.vcf.gz > filter_stats.txt

# 看一眼关键的Ti/Tv
grep "Tstv" raw_stats.txt
grep "Tstv" filter_stats.txt
小技巧:我经常把过滤前后的stats文件对比着看。如果过滤后Ti/Tv变好了但位点数掉了一大半,说明原始数据的质量确实堪忧。这时候我会回去检查测序流程。

4.4 本章知识图谱

我画了一张流程图,帮你理清bcftools在VCF处理中的位置和本章知识点。

bcftools VCF质检流程 VCF/BCF 输入 view 命令 查看、过滤、转换 query 命令 自定义格式输出 stats 命令 质量统计摘要 过滤后 VCF + 统计报告 ready for 一致性评估 ⚠️ 核心原则:先质检再分析,用 stats 判断数据质量,用 view/query 提取关键信息 多批次对比时,确保所有 VCF 经过相同的 view 过滤条件和 stats 统计口径

4.5 本章小结

这一章我们把bcftools装上了,也把view、query、stats三个命令跑通了。你可能注意到了,这些命令看起来简单,但配上不同的过滤表达式和格式控制符,能组合出非常强大的功能。

做一致性评估前,我建议你至少跑一遍stats看看数据底子。如果原始数据质量太差,后面的评估就没意义了。

重点回顾:
  • 安装后一定要跑 bcftools test 验证环境
  • view 用于看数据和过滤,query 用于提取字段,stats 用于质量评估
  • 三个命令互相配合,能覆盖VCF处理的绝大多数场景