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 时,先拿一条已知序列测一下。看看输出格式是否合你意,再批量处理。我现在每次建新库或换参数,都会先用 5 条 query 跑个“探路”任务,确认无误才全量投递——能省掉很多重跑时间。
总结
BLAST 命令行看似参数多,但只要掌握 -db、-query、-out、-outfmt、-evalue 这几个核心,再配合 -num_threads 提速,就能覆盖 90% 以上的日常比对需求。遇到特殊场景(短序列、跨物种、低保守区),再去调 -word_size、-gapopen 之类的高级参数。
别忘了多看官方文档,但更推荐你自己动手跑几组对比实验——同一批数据,参数改一两个值,看看结果差多少。实践出真知嘛。