求助:根据第一行seqID提取第二行的序列数据,求可实现的perl程序
有fasta文件如下:>leaf_1AAGACCATTCGAGCTTATCTCTTC>leaf_2ATGGAGAAGGAAATGAAGAGCAGT>leaf_3TGGCT...
有fasta文件如下:
>leaf_1
AAGACCATTCGAGCTTATCTCTTC
>leaf_2
ATGGAGAAGGAAATGAAGAGCAGT
>leaf_3
TGGCTGTAAGTCATACCTGTCA
>leaf_4
CGCGGAGTAGATCAGTTTGGTA
>leaf_5
AGTAACGGCTTTACAAGAATCAAA
......
现在有另一个txt文件,包含我想提取的序列的名称:
>leaf_2
>leaf_4
>leaf_5
能否用perl程序实现如下功能:
根据序列名称提取数据库里的相应序列信息,输出到新文件中并以制表符分隔的格式显示,如下:
>leaf_2 ATGGAGAAGGAAATGAAGAGCAGT
>leaf_4 CGCGGAGTAGATCAGTTTGGTA
>leaf_5 AGTAACGGCTTTACAAGAATCAAA
谢谢!
我试了,但回车后没出任何结果。
你程序第三行的<IDlist.txt> <seq.fa>是不是需要做相应的改动?假设我需要查询的列表名leaf_query.txt,数据库文件名为leaf.fa
命令行输入:perl run.pl leaf_query.txt leaf.fa > leaf_result.txt
结果生成了相应文件,但文件是空的。是不是需要在程序中加入:
open (OUTPUT, ">Output.fa");
...print OUTPUT ">fruit_$._$line[0]_$line[1]\n"; 等语句?
你能否用我问题里的例子(包括文件名)再调试一下程序?谢谢! 展开
>leaf_1
AAGACCATTCGAGCTTATCTCTTC
>leaf_2
ATGGAGAAGGAAATGAAGAGCAGT
>leaf_3
TGGCTGTAAGTCATACCTGTCA
>leaf_4
CGCGGAGTAGATCAGTTTGGTA
>leaf_5
AGTAACGGCTTTACAAGAATCAAA
......
现在有另一个txt文件,包含我想提取的序列的名称:
>leaf_2
>leaf_4
>leaf_5
能否用perl程序实现如下功能:
根据序列名称提取数据库里的相应序列信息,输出到新文件中并以制表符分隔的格式显示,如下:
>leaf_2 ATGGAGAAGGAAATGAAGAGCAGT
>leaf_4 CGCGGAGTAGATCAGTTTGGTA
>leaf_5 AGTAACGGCTTTACAAGAATCAAA
谢谢!
我试了,但回车后没出任何结果。
你程序第三行的<IDlist.txt> <seq.fa>是不是需要做相应的改动?假设我需要查询的列表名leaf_query.txt,数据库文件名为leaf.fa
命令行输入:perl run.pl leaf_query.txt leaf.fa > leaf_result.txt
结果生成了相应文件,但文件是空的。是不是需要在程序中加入:
open (OUTPUT, ">Output.fa");
...print OUTPUT ">fruit_$._$line[0]_$line[1]\n"; 等语句?
你能否用我问题里的例子(包括文件名)再调试一下程序?谢谢! 展开
2个回答
展开全部
#!/usr/bin/perl -w
use strict;
die "perl $0 <IDlist.txt> <seq.fa>\n" unless(@ARGV == 2);
my %hash;
open IN,$ARGV[0];
while(<IN>){
chomp;
$_=~s/[> \t]+//g;
$hash{$_} = 1;
}
close IN;
open IN,$ARGV[1];
$/=">";
<IN>;
$/= "\n";
while(<IN>){
chomp;
my $name = $_;
$/=">";
my $seq= <IN>;
chomp $seq;
$seq =~s/\n//g;
$/ = "\n";
if(exists($hash{$name})){
print ">$name\t$seq\n";
}
}
close IN;
脚本保存为run.pl 序列所在文件假设为 a.fa 你所需要的ID列表所在文件为ID.txt
那么在命令行输入perl run.pl ID.txt a.fa 回车即可
结果将在屏幕打印出来。如果需要另存 则假设你另存为 c.txt
那么命令行输入
perl run.pl ID.txt a.fa > c.txt
use strict;
die "perl $0 <IDlist.txt> <seq.fa>\n" unless(@ARGV == 2);
my %hash;
open IN,$ARGV[0];
while(<IN>){
chomp;
$_=~s/[> \t]+//g;
$hash{$_} = 1;
}
close IN;
open IN,$ARGV[1];
$/=">";
<IN>;
$/= "\n";
while(<IN>){
chomp;
my $name = $_;
$/=">";
my $seq= <IN>;
chomp $seq;
$seq =~s/\n//g;
$/ = "\n";
if(exists($hash{$name})){
print ">$name\t$seq\n";
}
}
close IN;
脚本保存为run.pl 序列所在文件假设为 a.fa 你所需要的ID列表所在文件为ID.txt
那么在命令行输入perl run.pl ID.txt a.fa 回车即可
结果将在屏幕打印出来。如果需要另存 则假设你另存为 c.txt
那么命令行输入
perl run.pl ID.txt a.fa > c.txt
追问
我现在能保证我的数据库fa文件格式是正确的,所以怀疑问题出在了我的lst文件的格式上面。因为这个lst文件是我从Excel(Mac2011版)里的一列数据拷贝粘贴到写字板里生成的,很有可能产生了隐含的格式错误。我尝试用^n替换^p,也还是无济于事 : (
请问如何解决这个问题?怎样能够把Excel里的一列数据转换成正确的fasta格式输出呢?
追答
你这个是因为从EXCEL存出来的数据,它包含的换行符为\r\n,这样的话就会导致换行的失败,\r是将光标移动到行首,针对你的这个格式,可以尝试在里面替换一行代码再试试:
$_=~s/[> \t]+//g; 这一句 替换为
$_=~s/[> \t\r]+//g;
展开全部
open FASTA,$ARGV[0];
open LST,$ARGV[1];
while(<LST>){
chomp;
$id{$_}++;
}
while(<FASTA>){
chomp;
$name=$_;
chomp($seq=<FASTA>);
if (exists $id{$name}){
print "$name\t$seq\n";
}
}
perl aaa.pl fa txt > answer
open LST,$ARGV[1];
while(<LST>){
chomp;
$id{$_}++;
}
while(<FASTA>){
chomp;
$name=$_;
chomp($seq=<FASTA>);
if (exists $id{$name}){
print "$name\t$seq\n";
}
}
perl aaa.pl fa txt > answer
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询