Как создать выходной файл (переписать)? - PullRequest
1 голос
/ 27 мая 2019

Я пытался решить свой сценарий, но я был бы очень признателен за помощь. У меня есть 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
...

Я хочу написать «переписанную» версию второго файла, изменив регистрационный номер «AB280738.1» для названий видов из файла fasta, сгенерировав вывод с разделителями табуляции следующим образом:

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 строк, он выполняет сопоставление, но это не так писать правильно.

Я работал над этим кодом, который я вам показываю. Я вижу, что "соответствующая" часть моего сценария работает, но я думаю, что я не делаю правильный шаг "push". Помимо этого, что-то делает мои вложенные циклы рекурсивными, потому что есть несколько строк из одного совпадения. Чтобы знать, что он работает, выход должен иметь то же количество строк, что и второй вход, ввод праймеров. Второй «отпечаток» говорит мне, сколько раз шаблон соответствовал, и он дает мне 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 голосов
/ 27 мая 2019

Вот пример, где я считываю заголовки мульти-fast-файла в хеш, прежде чем приступить к обработке файла проверки учебника для начинающих.Таким образом, я избегаю двойной петли 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...