生物信息学研究中,经常需要从公共数据库中下载数据,如从NCBI的GenBank中下载核酸/蛋白质序列或PubMed数据库下载生物医学文献信息,从Ensembl数据库中下载基因组序列,从PDB数据库中下载蛋白质三级结构数据等。这些数据库一般都提供数据下载接口,如NCBI提供Efetch工具,可以批量下载数据。
我们先看一个从GenBank下载序列数据的shell脚本:
[peter@ibi98 seq_download]$ cat get_seq_from_GenBank.sh
#!/bin/bash
if [ $# != 2 -o "$1" == "-h" ] #如果命令行参数不是2个或第一个参数是-h,就显示用法并退出
then
echo "Usage: cat SeqIDFile |$0 Database(nuccore|nucleotide|
popset|protein|sequences) SeqType(xml|gp|gb|fasta)" #该URL中间不要有换行
exit 1
fi
db=$1 #第1个命令行参数是数据库
seqtype=$2 #第2个命令行参数是序列类型
while read id #从标准输入读取序列的ID
do
wget -q -O - "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/
efetch.fcgi?db=$db&id=$id&rettype=$seqtype" #该URL中间不要有换行
done
上例中的下载地址https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=$db&id=$id&rettype=$seqtype是NCBI为使用脚本下载提供的Efetch下载地址。Efetch是NCBI提供的Entrez编程工具(Entrez Programming Utilities, E-utilities)的一部分,提供多种资源的下载地址,通过改变URL中的参数,可以从不同的数据库中下载不同格式的数据。下面是执行结果:
[xiezy@ibi98 seq_download]$ head -2 seq_id #序列ID文件 BAH04252.1 BAH04251.1 [peter@ibi98 seq_download]$ cat seq_id |./get_seq_from_GenBank.sh protein fasta >BAH04252.1 LEAFY, partial [Cardamine alpina] WNPTRATVQALPPVPPPPQQQPATTQTAAFGMRLGGLEGLFGAYGIRFYTAAKIAELGFTASTLVGMRDE ELEEMMNSLSHIFRWELLVGERYGIKAAVRAERRRLQEEEEESSKRRHLLLSAAGDSGTHHALDALSQED DWTGLSEEPVQQQDNQTDAAGNNGGYWEAGKGK >BAH04251.1 LEAFY, partial [Cardamine alpina] WNPTRATVQALPPVPPPPQQQPATTQTAAFGMRLGGLEGLFGAYGIRFYTTAKIAELGFTASTLVGMRDE ELEEMMNSLSHIFRWELLVGERYGIKAAVRAERRRLQEEEEESSKRRHLLLSAAGDSGTHHALDALSQED DWTGLSEEPVQQQDNQTDAAGNNGGYWEAGKGK ......
如果没给参数,会提示程序的用法:
[peter@ibi98 seq_download]$ cat seq_id |./get_seq_from_GenBank.sh
Usage: cat SeqIDFile |./get_seq_from_GenBank.sh Database(nuccore|nucleotide|popset|
protein|sequences) SeqType(xml|gp|gb|fasta)
下面的shell脚本的作用是从PubMed数据库下载文献信息:
[peter@ibi98 get_pubmed]$ cat pubmed.sh
#!/bin/bash
if [ "$1" == "-h" -o "$1" == "--help" ] #显示程序使用方法
then
echo "Usage: $0 <StartID> <EndID> >> OutFile"
exit 0
fi
if [ $# -ne 2 ] #显示程序使用方法
then
echo "Usage: $0 <StartID> <EndID> >> OutFile"
exit 1
fi
start=$1 #起始文献ID
end=$2 #结束文献ID
stop=0
while [ $stop -lt $end ]
do
stop=$((start+399)) #每次下载400篇
if [ $stop -gt $end ] #如果不够400篇,就下载到第二个参数定义的那一篇
then
stop=$end
fi
ids=`seq -s',' $start $stop` #把ID用逗号连起来
((start+=400))
#下载medline格式的文献信息
wget -q -O - "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?
db=pubmed&id=$ids&retmode=text&rettype=medline" #该URL中间不要有换行
sleep 2 #停顿2秒,避免下载太频繁,IP被封
done
PubMed数据库搜集了超过27,000,000篇来自MEDLINE(Medical Literature Analysis and Retrieval System Online)的生物和医学文献的信息,并在不断更新中。数据库中包括题目、作者和摘要等文献信息都可以下载,是生物学和医学文本挖掘研究常用的资源。下面是上例一次执行的部分结果:
[peter@ibi98 get_pubmed]$ ./pubmed.sh 10000001 10000010
PMID- 10000001
OWN - NLM
STAT- Publisher
DA - 19990217
LR - 19990217
IS - 0163-1829 (Print)
IS - 0163-1829 (Linking)
VI - 44
IP - 8
DP - 1991 Aug 15
TI - Quantum-optical properties of polariton waves.
PG - 3736-3756
FAU - Artoni
AU - Artoni M
FAU - Birman
AU - Birman JL
LA - eng
PT - Journal Article
PL - United States
TA - Phys Rev B Condens Matter
JT - Physical review. B, Condensed matter
JID - 9878217
EDAT- 1991/08/15 00:00
MHDA- 1999/02/19 00:00
CRDT- 1991/08/15 00:00
PST - ppublish
SO - Phys Rev B Condens Matter. 1991 Aug 15;44(8):3736-3756.
PMID- 10000002
结果内容较多,上面只显示了前面部分结果。
如果知道了序列或文献的ID,利用上面的脚本,可以方便地下载相应的序列和文献信息。从其他数据库下载数据方法也是类似的,核心的命令就是wget或curl。