BLAST 命令行工具的基本使用与参数详解

BLAST 这工具,在基因组注释里几乎是每天都在用。说白了,它就像一把瑞士军刀,帮你快速找到新序列跟已知数据库里哪些片段长得像。

我刚开始做注释那会儿,经常对着命令行手足无措——参数一堆,文档又长。但跑过几十次之后,你会发现核心就那么几个参数,把关键的调对了,结果就八九不离十。今天我把这些经验拆开揉碎,跟你聊聊。

选对程序版本:BLAST+ 还是 legacy BLAST?

现在基本都用 BLAST+(也就是 blastn、blastp 这些命令)。老版的 blastall 早就不维护了。我的习惯是直接装 NCBI 官方提供的 ncbi-blast+ 包,稳定,也省心。

装完后敲下面命令看看是否正常:

blastn -version

能打出版本号,说明环境就绪了。

先搞清楚你要哪个程序

BLAST+ 一共五个核心程序,选错的话比对结果会非常奇怪。我见过不少新手拿 DNA 序列去跑 blastp,结果啥也没比出来——因为程序默认你输入的是蛋白质序列。

下表帮你快速对号入座:

程序名查询序列类型数据库序列类型典型场景
blastn核酸核酸比对基因间区、EST 序列
blastp蛋白质蛋白质功能域、直系同源查找
blastx核酸(翻译)蛋白质注释新转录本、检测编码潜力
tblastn蛋白质核酸(翻译)查找蛋白质在基因组上的同源区域
tblastx核酸(翻译)核酸(翻译)高度保守的非编码区挖掘

记住一个原则:你想“跨类型”比对时,就选 blastx 或 tblastn。我经常用 blastx 去验证 RNA-seq 组装出来的转录本是不是真的有蛋白编码能力——效果很直接。

基本命令长啥样?

一个完整的 BLAST 命令行,通常长这样:

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

这条命令做了什么?

  • -db nt:指定数据库,这里是 NCBI 的 nt 库。
  • -query myseq.fasta:你的待查序列文件。
  • -out result.txt:结果输出文件。
  • -outfmt 6:输出为表格格式,带注释。
  • -evalue 1e-5:期望阈值,低于它的结果才输出。
  • -num_threads 4:用 4 个线程跑,快一些。

看起来很简单对吧?但真正折腾人的往往是后面的参数调优。

核心参数详解:哪些值得调?

这部分是我做注释项目里摸爬滚打总结出来的。参数调得好,能筛出弱同源;调得不好,全是垃圾结果。

参数含义我常用的推荐值注意事项
-evalue期望值阈值1e-5 或 1e-10严格比对用 1e-10,宽松比对用 1e-3
-outfmt输出格式6 或 '6 qseqid sseqid pident length mismatch gapopen qstart qend sstart send evalue bitscore'6 是标准表格,可自定义列
-word_size初始匹配的单词长度核酸: 11, 蛋白: 3调小可增加敏感度,但速度变慢
-gapopen空位开放罚分核酸: 5, 蛋白: 11调大能减少大插入缺失
-gapextend空位延伸罚分核酸: 2, 蛋白: 1延伸罚分小,允许长 gap
-reward / -penalty匹配得分 / 错配罚分reward: 2, penalty: -3 (核酸)适用于短序列高精确比对
-strand比对链方向both / plus / minus双端测序选 both
-max_target_seqs每个查询保留的最大结果数5 或 10调太多会增加文件大小,意义不大
-num_threads线程数你的机器核心数减 1设置过高反而容易 IO 瓶颈

小技巧: 如果你想找到非常远的同源(比如跨物种保守的非编码区),可以把 -word_size 降一半,同时放宽 -evalue 到 1e-3。但注意——这样会跑得很慢,而且假阳性也增多。我一般先用默认粗筛一遍,再用降低 word_size 的二次比对去补漏。

输出格式控制——比默认格式好用 10 倍

默认的 -outfmt 0 是带空行和多行描述的“可读格式”,但只要你是做批量处理,几乎没人用。大多数人选 -outfmt 6(tab 分隔,带列名)。

我更喜欢自己定制列,比如只取我关心的字段:

blastn -db refseq -query test.fa -out test_custom.tsv \
  -outfmt '6 qseqid sseqid pident length qstart qend sstart send evalue bitscore ssciname stitle'

这样出来的文件直接可以导入 Excel 或 pandas,做统计非常顺手。

注意: 自定义 -outfmt '6 ...' 时,引号千万别漏。我曾经写成一个字符串不带引号,结果 BLAST 把它当成单独的参数,输出了一个巨大无比的默认格式文件,把我 1 TB 的硬盘塞爆了……从那以后我再也不敢省略引号了。

调优与避坑:我的实战教训

  • 数据库路径别写错: NCBI 的 nt/nr 数据库解压后是多个文件,但 -db 参数只写前缀。比如数据库文件叫 nt.00.nal、nt.01.nal… 你就写 -db nt。我第一次用的时候傻乎乎写了 nt.00,结果报错“Database does not exist”。
  • 多线程不是越多越好: 我试过在 64 核机器上开 60 个线程,结果磁盘 IO 成了瓶颈,CPU 吃不满。多数场景下 -num_threads 8 就很均衡。
  • E-value 的陷阱: 对于长序列(比如全长 cDNA),默认 1e-5 可能太严。你的查询序列有 2 kb 长,e-value 会被严重惩罚,导致很多真同源被过滤掉。这时候我习惯把阈值放宽到 1e-3,再在后期过滤。
  • 永远不要忽略 -outfmt 6 的空白: 如果你用 -outfmt 6 但后面不指定列,程序会输出一套默认列。仔细核对默认列顺序和你的后续脚本是否匹配。我踩过坑——默认列的顺序在不同版本里居然变过,导致解析脚本全部报错。

把流程串起来:一张图看到底

下面这张 SVG 图概括了 BLAST 命令行调用的完整决策路径。从你的查询序列开始,顺着箭头走,就知道每一步该怎么选。

BLAST命令行调用核心流程 输入查询序列 (FASTA) 查询序列是核酸还是蛋白? → 核酸: blastn / blastx ;蛋白: blastp / tblastn 设置必需参数 -db <数据库前缀> -query <文件> -out <结果文件> 可选参数微调 -evalue -outfmt -word_size -gapopen -gapextend -num_threads -max_target_seqs -strand 运行命令 → 输出结果文件 解析 -outfmt 6 表格 → 下一步注释

给新手的建议: 第一次跑 BLAST 时,先拿一条已知序列测一下。看看输出格式是否合你意,再批量处理。我现在每次建新库或换参数,都会先用 5 条 query 跑个“探路”任务,确认无误才全量投递——能省掉很多重跑时间。

总结

BLAST 命令行看似参数多,但只要掌握 -db、-query、-out、-outfmt、-evalue 这几个核心,再配合 -num_threads 提速,就能覆盖 90% 以上的日常比对需求。遇到特殊场景(短序列、跨物种、低保守区),再去调 -word_size、-gapopen 之类的高级参数。

别忘了多看官方文档,但更推荐你自己动手跑几组对比实验——同一批数据,参数改一两个值,看看结果差多少。实践出真知嘛。