日常工作中,常常需要从 ensemble下载基因的外显子序列和 5‘和 3’UTR,用于设计引物和探针等。例如:BAP1
1. 查找人的 BAP1基因
2. 选择人的BAP1基因
3. 下载目标转录本对应的BAP1基因序列
4. 下载BAP1序列
5. 下载的序列特点,>开头,exon没有顺序号,有时为了拼接序列需要添加外显子号,手动添加容易出错,并且序列信息多的时候操作非常麻烦,因此编写perl脚本添加外显子号。
6. perl脚本的思路为,">"所在的行为键,后续的基因序列为值,并且把基因序列中的换行符去掉(要同时考虑win、linux和mac来源文件的兼容性),具体代码如下。
#!/usr/bin/perl
use warnings;
use strict;
# 输入输出
open FILE, '<', "$ARGV[0]" or die "Could not open the file:$ARGV[0]\n$!";
open SAMPLE, '>', "$ARGV[1]" or die "Could not open the file:$ARGV[1]\n$!";
open OUT, '>', "$ARGV[2]" or die "Could not open the file:$ARGV[2]\n$!";
my $i = 0;
my ($str,$title);
my %title_seq;
while(my $file = <FILE>){
$file =~ s/\r?\n//; #去掉每行末尾的换行符/回车符
unless($file){next;} #跳过空行也可以写成 next if(/^\s+$/);
if($file =~ m/^>(.+?)\s*$/){
$i++;
if($file =~ /exon:/){
$str = "exon". $i . ":";
$file =~ s/exon:/$str/;
$title = $file;
}
else{
$title = $file;
}
print SAMPLE "$title\n";
}
elsif(defined $title){ # 建立哈希
# 将这条序列的长度进行累加,直到遇到>或者文件尾
$title_seq{$title} .= $file;
}
}
close FILE;
close SAMPLE;
open IN, '<', "$ARGV[1]" or die "Could not open the file:$ARGV[1]\n$!";
while(<IN>){ # 按照title顺序输出哈希
s/\r?\n//;
unless($_){next;}
if(exists $title_seq{$_}){
print OUT "$_\n$title_seq{$_}\n";
}
}
close IN;
close OUT;
7. 命令和结果
perl ensembl_gene_exon_number_dxl.pl Homo_sapiens_BAP1_001_sequence.fa title_of_BAP1 final_sequence_of_BAP1