如何创建(重新)写入输出文件?

时间:2019-05-27 17:53:48

标签: regex perl

我一直在尝试解决我的脚本,但是我真的很感谢您的帮助。 我有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;
           }      
        }       
      }       
   }  





1 个答案:

答案 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;
}