我一直在尝试解决我的脚本,但是我真的很感谢您的帮助。 我有2个输入文件。
第一个是带有以下标题的多文件文件:
'>AH008024.2 Angelica acutiloba internal transcribed spacers 1 and 2, partial sequence'
'>AJ969149.1 Carthamus tinctorius partial ITS2'
....
(引号只是为了使>符号可见,否则不会显示...)
第二个是底漆验证文件,如下所示:
AB280738.1,UniplantR,49,68,forward,CCCGHYTGAYYTGRGGTCDC,20,71.4,,,56.5 - 69.8
AB280739.1,UniplantR,49,68,forward,CCCGHYTGAYYTGRGGTCDC,20,71.4,,,56.5 - 69.8
AB280740.1,UniplantR,49,68,forward,CCCGHYTGAYYTGRGGTCDC,20,71.4,,,56.5 - 69.8
...
我想编写第二个文件的“重写”版本,更改fasta文件中物种名称的登录号“ AB280738.1”,并生成一个制表符分隔的输出,如下所示:
AB280738.1 Glycyrrhiza uralensis ITS1, 5.8S rRNA and ITS2 UniplantR 49 68 forward CCCGHYTGAYYTGRGGTCDC 20 71.4 56.5 - 69.8
AB280739.1 Glycyrrhiza glabra ITS1, 5.8S rRNA and ITS2 UniplantR 49 68 forward CCCGHYTGAYYTGRGGTCDC 20 71.4 56.5 - 69.8
...
最终输出的行数必须与第二个输入文件(底漆文件)的行数相同,在本例中为420行,但是我当前的输出是写入292140行,它在进行匹配,但不是写作正确。
我一直在处理向您展示的这段代码。 我看到脚本的“匹配”部分正在工作,但是我认为我没有在执行正确的“推送”步骤。除此之外,还有一些事情使我的嵌套循环递归,因为同一匹配中有多行。 要知道它正在工作,输出必须具有与第二个输入(引物输入)相同的行数。 第二个“打印”告诉我,您多次匹配该模式,它给了我540,而不是420。
如果有人想尝试,我想上传我的输入文件和当前输出,但是我找不到上传文件的位置。
#!/usr/bin/perl
use diagnostics;
use warnings;
use strict;
print "multifasta:\t";
my $arq1 = <STDIN>;
open (MYFILE, $arq1);
my @file = <MYFILE>;
close (MYFILE);
print "file to rename:\t";
my $arq2 = <STDIN>;
open (MYFILE2, $arq2);
my @file2 = <MYFILE2>;
close (MYFILE2);
my @new_file=();
my $count = ();
open (NEW_FILE, '>>plant_names_primer_bind_renamed.txt');
foreach my $line2 (@file2) {
my @fields = split (/,/, $line2);
my $accession2 = shift(@fields);
foreach my $line (@file) {
if ($line =~ /^>/) {
my $rev = reverse $line;
chop ($rev);
my $header = reverse $rev;
my @header = split (/ /, $header);
my $accession = shift (@header);
if ($accession =~ /$accession2/) {
$count++;
print "$accession2 match $accession\t@header\t@fields\n\n";
print "$count\n";
push (@new_file, ("$accession2\t@header\t@fields"));
print NEW_FILE @new_file;
}
}
}
}
答案 0 :(得分:0)
这是一个示例,其中我在开始处理引物验证文件之前将多个fasta文件头读入哈希。这样,我避免了两个for
循环:
use feature qw(say);
use strict;
use warnings;
{
my $fasta_data = read_fasta_file();
print "file to rename:\t";
chomp (my $fn = <STDIN>);
open ( my $fh, '<', $fn ) or die "Could not open file '$fn': $!";
my $save_fn = 'plant_names_primer_bind_renamed.txt';
open ( my $save_fh, '>', $save_fn ) or die "Could not open file '$save_fn': $!";
my $count = 0;
while (my $line = <$fh>) {
chomp $line;
my @data = split /,/, $line;
if (@data) {
my $key = $data[0];
my $def = $fasta_data->{$key};
if (defined $def) {
#say ++$count;
say $save_fh join "\t", $key, $def, @data[1..$#data];
}
}
}
close $save_fh;
close $fh;
}
sub read_fasta_file {
print "multifasta:\t";
chomp(my $fn = <STDIN>);
open ( my $fh, '<', $fn ) or die "Could not open file '$fn': $!";
my %data;
while (my $line = <$fh>) {
chomp $line;
my ($key, $value ) = $line =~ /^>(\S+)\s+(.*)$/;
$data{$key} = $value if defined $value;
}
close $fh;
return \%data;
}