3. BLAST 命令行工具:安装、配置与基本用法
好,到了第三章,我们终于要跟 BLAST 命令行工具正面打交道了。说实话,很多做生信的同学第一次在终端敲命令,心里多少有点发怵。我当年也一样,对着黑乎乎的窗口,不知道该从哪里下手。
别急,这一章我带你走一遍。从安装到跑出第一条比对结果,半小时内搞定。
3.1 安装方式的选择
BLAST 的官方版本是 NCBI 发布的,全称叫 BLAST+。目前主流安装方式有两种:conda 和 手动编译。我个人更推荐 conda,省心。但你若是要在超算上装,或者没联网权限,那就得走手动。
方式一:conda 安装(推荐)
Conda 装 BLAST 是最快的。我记得第一次用 conda 装 BLAST,输完命令泡杯咖啡回来就好了。实际上一两分钟的事。
conda install -c bioconda blast
如果你还没装 conda,先去 https://docs.conda.io 下个 Miniconda。装好之后建个环境,避免跟已有工具冲突:
conda create -n blast_env
conda activate blast_env
conda install -c bioconda blast
验证安装是否成功,跑一句:
blastn -version
# 输出类似这样:
# blastn: 2.15.0+
# Package: blast 2.15.0
blast_202405。这样后续维护起来,哪套环境是干什么的一目了然。
方式二:手动安装
手动安装听起来麻烦,其实也不复杂。你去 NCBI 的 FTP 下载预编译的二进制包就行。项目里我遇到过客户要求离线环境,不联网,conda 用不了,那就只能手动。
# 下载 Linux 64 位的 BLAST+ 二进制包
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
# 移动到常用目录
mv ncbi-blast-2.15.0+ /opt/
解压后的 bin/ 目录里全是可执行文件。接下来要做的是配置环境变量。
3.2 环境变量配置
BLAST 装好了,但你直接在终端敲 blastn 会提示「command not found」。为什么?系统不知道你把它放哪了。你需要把路径加到 PATH 环境变量里。
打开你的 shell 配置文件。现在大多数 Linux 和 macOS 用 ~/.bashrc 或 ~/.zshrc。我在项目里曾遇到有同事把 PATH 写错了,结果整个系统都炸了……所以这个坑你一定要避开。
# 用 vim 或 nano 打开配置文件
nano ~/.bashrc
# 在文件末尾添加以下内容(路径换成你自己的)
export PATH="/opt/ncbi-blast-2.15.0+/bin:$PATH"
# 保存退出后,使其生效
source ~/.bashrc
$PATH 的位置不要搞反。一定要写成 /path/to/blast/bin:$PATH,而不是 $PATH:/path/to/blast/bin。后者会导致系统命令被你的 blast 目录覆盖,轻则找不到 ls,重则系统崩溃。我曾经亲眼见过因为这个错误,同事的服务器连 sudo 都跑不了。
验证一下是否生效:
which blastn
# 输出:/opt/ncbi-blast-2.15.0+/bin/blastn
另外,BLAST 还有一个重要的环境变量:BLASTDB。它告诉 BLAST 默认去哪找数据库。如果设置了,你跑比对时就不用每次都指定 -db 的全路径。
export BLASTDB="/path/to/your/databases"
3.3 基本用法概览
BLAST+ 工具包里包含很多子程序。你平时用得最多的就这几个:
| 命令 | 用途 | 查询类型 |
|---|---|---|
blastn |
核酸 vs 核酸 | DNA/RNA |
blastp |
蛋白 vs 蛋白 | 蛋白质 |
blastx |
核酸翻译后 vs 蛋白 | DNA→蛋白 |
tblastn |
蛋白 vs 核酸翻译 | 蛋白→DNA |
tblastx |
核酸 vs 核酸(双向翻译) | DNA→蛋白→DNA |
初学者最容易搞混的是 blastx 和 tblastn。你想想看,前者是你有一段未知的 cDNA,想看看它编不编码已知蛋白;后者是你手里有蛋白序列,想从基因组里找它对应的基因位置。方向反了,结果就是一堆 garbage。
每个命令的参数结构差不多,核心就三个东西:查询文件(query)、数据库(db)、输出格式(outfmt)。
blastn -query my_sequence.fasta -db nt -out result.txt -outfmt 6
这句命令意思:拿 my_sequence.fasta 里的核酸序列,去检索 nt 这个库,输出成表格格式(-outfmt 6),结果存到 result.txt。
你可能注意到了,db 后面只写了个 nt。但你下载的数据库其实是一堆文件,比如 nt.00.nhd、nt.01.nhd……你只需要指定共同前缀就行。BLAST 会自动去找所有 nt.* 文件。
3.4 第一个实战:跑一条blastn
光说不练假把式。我们直接上手跑一次。先准备一个简单的查询序列,假设是从某个细菌里克隆出来的16S rRNA片段。
# 先建一个测试查询文件
echo ">test_16S
AGAGTTTGATCMTGGCTCAGATTGAACGCTGGCGGCAGGCCTAACACATGCAAGTCGAACGGTAACAGGAAGAAGCTTGCTTCTTTGCTGACGAGTGGCGGACGGGTGAGTAATGTCTGGGAAACTGCCTGATGGAGGGGGATAACTACTGGAAACGGTAGCTAATACCGCATAACGTCGCAAGACCAAAGAGGGGGACCTTCGGGCCTCTTGCCATCGGATGTGCCCAGATGGGATTAGCTAGTAGGTGGGGTAACGGCTCACCTAGGCGACGATCCCTAGCTGGTCTGAGAGGATGACCAGCCACACTGGAACTGAGACACGGTCCAGACTCCTACGGGAGGCAGCAGTGGGGAATATTGCACAATGGGCGCAAGCCTGATGCAGCCATGCCGCGTGTATGAAGAAGGCCTTCGGGTTGTAAAGTACTTTCAGCGGGGAGGAAGGGAGTAAAGTTAATACCTTTGCTCATTGACGTTACCCGCAGAAGAAGCACCGGCTAACTCCGTGCCAGCAGCCGCGGTAATACGGAGGGTGCAAGCGTTAATCGGAATTACTGGGCGTAAAGCGCACGCAGGCGGTTTGTTAAGTCAGATGTGAAATCCCCGGGCTCAACCTGGGAACTGCATCTGATACTGGCAAGCTTGAGTCTCGTAGAGGGGGGTAGAATTCCAGGTGTAGCGGTGAAATGCGTAGAGATCTGGAGGAATACCGGTGGCGAAGGCGGCCCCCTGGACGAAGACTGACGCTCAGGTGCGAAAGCGTGGGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGTCGACTTGGAGGTTGTGCCCTTGAGGCGTGGCTTCCGGAGCTAACGCGTTAAGTCGACCGCCTGGGGAGTACGGCCGCAAGGTTAAAACTCAAATGAATTGACGGGGGCCCGCACAAGCGGTGGAGCATGTGGTTTAATTCGATGCAACGCGAAGAACCTTACCTGGTCTTGACATCCACGGAAGTTTTCAGAGATGAGAATGTGCCTTCGGGAACCGTGAGACAGGTGCTGCATGGCTGTCGTCAGCTCGTGTTGTGAAATGTTGGGTTAAGTCCCGCAACGAGCGCAACCCTTATCCTTTGTTGCCAGCGGTCCGGCCGGGAACTCAAAGGAGACTGCCAGTGATAAACTGGAGGAAGGTGGGGATGACGTCAAGTCATCATGGCCCTTACGACCAGGGCTACACACGTGCTACAATGGGCACTACAAAGAGAAGCGACCTCGCGAGAGCAAGCGGACCTCATAAAGTGCGTCGTAGTCCGGATCGGAGTCTGCAACTCGACTCCGTGAAGTCGGAATCGCTAGTAATCGTGGATCAGAATGCCACGGTGAATACGTTCCCGGGCCTTGTACACACCGCCCGTCA" > test_16S.fasta
现在我们随便用个小型数据库来演示。NCBI 提供了很多预构建库,你可以先下载 mini 版的 refseq_rna 来练手:
# 下载小数据库(大约 200 MB,第一次会慢一点)
update_blastdb.pl --decompress refseq_rna
# 跑 blastn
blastn -query test_16S.fasta -db refseq_rna -out test_blast_result.txt -outfmt 6
跑完看看结果文件前几行:
head test_blast_result.txt
# 输出类似这样:
# test_16S NR_114481.1 98.12 456 8 1 1 456 153 608 1.2e-234 1245
# test_16S NR_114482.1 97.81 412 7 1 2 413 89 500 3.4e-210 1120
每列含义(-outfmt 6 默认输出格式为标准的 12 列制表符分隔):qseqid、 sseqid、 pident、 length、 mismatch、 gapopen、 qstart、 qend、 sstart、 send、 evalue、 bitscore。
- 第一行:
pident=98.12%,说明比中序列相似度极高。 evalue=1.2e-234,极小的 E 值,显著匹配。bitscore=1245,分数越高越好。
3.5 常用参数速查
除了 -outfmt 6,我在项目里最常用的还有这几个参数:
| 参数 | 含义 | 举例 |
|---|---|---|
-evalue |
设置 E 值阈值,只保留小于该值的比对 | -evalue 1e-5 |
-max_target_seqs |
最多保留多少个目标序列 | -max_target_seqs 10 |
-max_hsps |
每个目标最多保留几个 HSP | -max_hsps 5 |
-num_threads |
使用几个 CPU 线程 | -num_threads 4 |
-outfmt |
输出格式(0=普通,6=表格,10=ASN.1) | -outfmt 6 |
-evalue 别设太严。我一般先用 1e-5,跑完后看结果分布再调。太严的话,可能把真的同源序列也过滤掉了。
3.6 本章知识图谱
下面这张 SVG 图,帮你把 BLAST 命令行工具的核心脉络串起来:
module avail blast 或 which blastn。我有个项目,因为没检查,自己装了一份,结果跟系统自带的版本冲突,折腾了两天才排查出来。