我一直坚持使用一些脚本!
我在2008年制作了这个剧本,现在我正在使用一些修改,我得到错误!
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
sub getSequences ($) {
my $file = $_[0];
open (INFILE, "<$file") || die "Error1 in opening in file: $file. $!\n";
my @lines = <INFILE>;
my $header; my %header2seq = ();
foreach my $line (@lines) {
chomp $line;
if ($line =~ /^(>.+)$/o) {
$header = $1;
}
else {$header2seq {$header} .= $line; }
}
#print %header2seq;
close (INFILE);
return (\%header2seq);
}
sub MakeSpList ($) {
my $sp_list = $_[0]; my %sp_names = ();
open (INFILE2, "<$sp_list") || die "Error2 in opening in file: $sp_list. $!\n";
my @sps = <INFILE2>;
foreach my $line (@sps) { chomp $line; $sp_names {$line} = 1; }
close (INFILE2);
#print Dumper (%sp_names);
return (\%sp_names);
}
sub CompareSpList2Sequences ($$$) {
my $ref_header2seq = $_[0] ; my $ref_sp_names = $_[1]; my $file = $_[2];
open (OUTFILE, ">$file.subdata") || die ("Error3 in opening out file: $file.subdata. $!\n");
foreach my $key (keys %$ref_header2seq) {
$key =~ m/^>([A-Z]+[0-9]+[A-Z+]).+$/o;
#print "$1\n";
my $header_sub = $1;
#print $header_sub, "\n";
#print $ref_sp_names, "\n";
if (exists $ref_sp_names -> {$header_sub}) {
my $seq = $ref_header2seq -> {$key};
print OUTFILE ">$key\n$seq\n";
}
}
close (OUTFILE);
return "42";
}
my $fasta_seqs = $ARGV[0]; my $sp_list = $ARGV[1];
my $ref_header2seq = getSequences ($fasta_seqs);
my $ref_sp_names = MakeSpList ($sp_list);
CompareSpList2Sequences ($ref_header2seq , $ref_sp_names, $fasta_seqs);
exit;
我想做的是:
我有一个包含序列的fasta文件:
YAL004W YAL004W SGDID:S000002136,Chr I,140760-141407,Genome Release 64-2-1,Dubious ORF,“Dubious open reading frame;根据现有的实验和比较序列数据不可能编码功能蛋白;完全重叠验证的基因SSA1 / YAL005C” ATGGGTGTCACCAGCGGTGGCCTTAACTTCAAAGATACCGTCTTCAATGGACAACAAAGAGACATCGAAAGTACCACCACCCAAGTCGAAAATCAAGACGTGTTCTTCCTTACCCTTCTTGTCCAAACCGTAAGCAATGGCAGCGGCGGTAGGTTCGTTAATAATACGCAAGACATTCAAACCAGCAATGGTACCAGCATCCTTGGTAGCTTGTCTTTGAGAATCGTTGAA
YAL005C SSA1 SGDID:S000000004,Chr I,141431-139503,Genome Release 64-2-1,反向互补,已验证ORF,“参与蛋白质折叠和NLS定向核转运的ATP酶; HSP70家族成员;形成伴侣蛋白与Ydj1p复合;定位于细胞核,细胞质和细胞壁; 98%与paralog Ssa2p相同,但两种蛋白质之间的细微差异提供了酵母[URE3]朊病毒繁殖和液泡介导的糖异生酶降解的功能特异性; Hsp104p的朊病毒原纤维”一般ATGTCAAAAGCTGTCGGTATTGATTTAGGTACAACATACTCGTGTGTTGCTCACTTTGCTAATGATCGTGTGGACATTATTGCCAACGATCAAGGTAACAGAACCACTCCATCTTTTGTCGCTTTCACTGACACTGAAAGATTGATTGGTGATGCTGCTAAGAATCAAGCTGCTATGAATCCTTCGAATACCGTTTTCGACGCTAAGCGTTTGATCGGTAGAAACTTCAAC靶向因子
我有另一个ID为的文件:
YAL005C YAL012W
我想在与ID的文件匹配时检索序列和所有标题。
但我收到此错误:不打印任何内容!
请你能帮帮我吗?
提前致谢。
答案 0 :(得分:1)
好的,所以 - 第45行是:
if (exists $ref_sp_names -> {$header_sub}) {
您的错误告诉您$header_sub
未定义。它由设置:
my $header_sub = $1;
以下内容:
$key =~ m/^(>[A-Z])\s.+$/o;
所以 - 这意味着正则表达式不匹配。我没有在您的示例数据中看到任何>
,因此无法与之匹配。当匹配失败时,$1
未定义,因此您的错误。你从print $key
陈述中得到了什么?
我还要注意 - .+$
很可能是多余的。同样 - o
标志 - 你可能也不想要那个。 http://perldoc.perl.org/perlre.html#Modifiers
答案 1 :(得分:0)
#!/usr/bin/perl
use warnings;
use strict;
use Bio::SeqIO;
my $fasta = shift; #this will just push whatever in cli in.
my $seqio_obj = Bio::SeqIO->(-file => $fasta, -format => 'fasta');
while ( my $seq = $seqio_obj->next_seq){
print $seq->id . ' = ' . $seq->seq() . "\n";
#in here you can do your fasta handling with the seq obj
}