3. BLAST命令行使用:BLAST+安装与实战

讲到序列比对,BLAST 绝对是绕不开的核心工具。不管是做基因组注释、功能预测,还是找同源序列,BLAST 都跑不掉。很多同学用惯了在线版,觉得点两下就能出结果。但我得说一句——真要做大规模数据分析,本地 BLAST 才是正道。

为什么?你想想看,几百条序列往 NCBI 网页一贴,服务器等半天不说,数据安全也是个问题。我个人的习惯:只要是做项目,不管大小,先搭本地 BLAST。今天咱们就把这事儿说透。

3.1 BLAST+ 的安装

BLAST+ 是 NCBI 官方维护的命令行工具集。相比老版的 blastall,它速度更快,参数也更规范。安装其实很简单。

核心思路:下载预编译二进制,解压,加入 PATH 就完事了。

以 Linux 系统为例,我通常这么干:

# 下载 BLAST+ 2.15.0(版本号根据需求调整)
wget https://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/LATEST/ncbi-blast-2.15.0+-x64-linux.tar.gz

# 解压
tar -zxvf ncbi-blast-2.15.0+-x64-linux.tar.gz

# 移到常用目录
sudo mv ncbi-blast-2.15.0+ /usr/local/

# 加入环境变量
export PATH=/usr/local/ncbi-blast-2.15.0+/bin:$PATH

Windows 用户呢?下载 Windows 版 exe 安装包,直接点下一步就行。安装完后记得把 C:\Program Files\NCBI\blast-2.15.0+\bin 加到系统环境变量里。

检查是否成功:打开终端输入 blastn -version。我习惯先跑这条命令确认环境没问题。

3.2 认识两大主力:blastn 与 blastp

BLAST+ 工具包里命令不少。但日常用得最多的,就两个:

  • blastn —— 核酸 vs 核酸
  • blastp —— 蛋白 vs 蛋白

这俩的逻辑一样,只是比对的对象不同。blastn 找的是 DNA 层面的相似性,blastp 看的是氨基酸层面的保守性。我在做植物基因组项目时遇到过一个问题:用 blastn 比对编码区序列,结果好多假阳性——因为内含子区域干扰太大。后来改用 blastp 比对翻译后的蛋白序列,结果明显干净多了。

注意:用 blastn 比对时,若 대상序列是真核生物,一定要考虑内含子问题。跨物种比对我更推荐用 blastp 做蛋白层面分析。

3.3 核心参数解析

咱们先看一个典型的 blastn 命令:

blastn -query my_seqs.fasta -db nt -out results.txt -outfmt 6 -evalue 1e-5 -num_threads 4

来拆解一下每个参数:

参数 作用 我的经验
-query 输入文件(FASTA 格式) 文件里序列别太多,建议一条记录一行
-db 数据库名称 第一次用记得先建索引(makeblastdb)
-out 输出文件名 我习惯加时间戳,避免覆盖之前的结果
-outfmt 输出格式(6=tabular, 5=XML) 下游分析用 tabular,人工查阅用默认
-evalue 期望阈值(越小越严格) 同源搜索我设 1e-5,找直系同源设 1e-10
-num_threads 线程数 别贪多,留一个给操作系统

blastp 的参数完全一样。唯一区别是数据库:blastp 用的是蛋白数据库(如 nr、swissprot)。

3.4 输出格式怎么选?

BLAST+ 支持 18 种输出格式。但常用的就三种:

  • 默认格式(outfmt 0):带比对信息的可读文本,适合人工查看。如果你就想看一眼结果,用这个。
  • Tabular 格式(outfmt 6):一列一列排好,每列含义固定。我几乎所有项目都用这个——因为写脚本处理起来太方便了。
  • XML 格式(outfmt 5):结构化的标记语言,适合程序解析。如果你做 pipeline 开发,用这个。

避坑指南:我曾经因为用了默认格式做批量分析,结果还要写脚本解析那堆文本…自找麻烦。后来统一改用 tabular 格式,一行一个匹配,舒服多了。

Tabular 格式的 12 列分别是:

1.  query acc.ver   — 查询序列ID
2.  subject acc.ver — 目标序列ID
3.  % identity      — 一致度
4.  alignment length — 比对长度
5.  mismatches      — 错配数
6.  gap opens       — 空隙数
7.  q.start        — 查询序列起始
8.  q.end          — 查询序列终止
9.  s.start        — 目标序列起始
10. s.end          — 目标序列终止
11. evalue         — 期望值
12. bit score      — 比特分

把这 12 列往 pandas 里一读,什么排序、筛选、统计,几分钟就能搞定。

3.5 实战:跑一次本地 BLAST

光说不练假把式。我们来跑一个完整的流程。

第一步:准备数据库

先得建索引。假设你手里有个 ref_genome.fasta 文件:

makeblastdb -in ref_genome.fasta -dbtype nucl -out my_db

-dbtype nucl 表示核酸数据库。如果是蛋白,就写 prot。

第二步:写查询序列

假设我们要找一段潜在的基因编码区,建一个 query.fasta:

>my_gene_1
ATGCGTACGATCGATCGATCGATCGATCGTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAG

第三步:运行 blastn

blastn -query query.fasta -db my_db -out blast_results.txt -outfmt 6 -evalue 1e-5 -num_threads 4

第四步:看结果

打开 blast_results.txt:

my_gene_1   ref_chr1    98.45   200  3  0  1  200  15000  15200  3e-50  200.5

这行信息很丰富:我们的基因比对上 1 号染色体的 15000–15200 区域,一致度 98.45%,evalue 3e-50,非常靠谱。

调试小技巧:我刚开始跑 BLAST 时,经常遇到“Database not found”错误。这是因为当前目录不对,或者数据库路径没写全。用绝对路径最保险。

3.6 把整个流程画出来

下面这张图总结了本地 BLAST 的完整工作流,从序列输入到结果解析,每一步都离不开刚才讲的内容。

BLAST 本地化运行知识结构图 BLAST 本地化运行知识体系 FASTA 查询序列 参考数据库 FASTA makeblastdb 建索引 blastn / blastp 运行比对 -outfmt 6 控制输出格式 默认文本可读 Tabular 表格化 XML 结构化 人工审阅 脚本批量处理 Pipeline 集成 evalue、一致度、比对长度是筛选结果的三个关键指标

这张图把流程分成了四层:输入 → 索引 → 比对 → 输出解析。每个环节都有对应命令和参数。你跟着走一遍,就基本掌握本地 BLAST 的核心了。

再强调一次:做大规模批量比对时,千万别用默认格式输出。我见过有人这样干,结果几万条结果解析到崩溃。统一用 tabular(outfmt 6)或 XML(outfmt 5),后续处理省一大半时间。

嗯,BLAST 这章就到这儿。掌握了这些,你已经能独立完成一整套本地序列比对分析。下一步就是把这些匹配结果整合到基因组注释流程里,但那又是另一课的内容了。