как я могу заменить строки из двух разных файлов с помощью регулярного выражения в Perl? - PullRequest
0 голосов
/ 07 августа 2020

У меня есть 1-й файл (Delta_spike_sorted.fasta) в формате:

>lcl|KJ584357.1  
AAAAA 
>lcl|JQ065046.1  
GGGGG

и 2-й файл (Delta_final.fasta) в формате:

>KJ584357.1 Porcine coronavirus HKU15 strain KY4813, complete genome
TTTTTT 
>JQ065046.1 Magpie-robin coronavirus HKU18 strain HKU18-chu3, complete genome  
CCCCCC

I ' m пытается написать сценарий для замены> lcl ... 1-го файла эквивалентным заголовком 2-го файла, сопоставив их идентификаторы (те, которые находятся рядом с lcl). Окончательный результат должен быть примерно таким:

>Porcine coronavirus HKU15 strain KY4813
AAAAA  
>Magpie-robin coronavirus HKU18 strain HKU18-chu3  
GGGGG

Теперь, когда я снова это вижу, возможно, использование хэшей будет наиболее подходящим вариантом (извините за множество ошибок, это мой первый пост здесь, также я по программированию новичок)

#!/usr/bin/perl -w
open (FIN, "< coronavirus_complete/complete_final/Delta_final.fasta") or die "unable to open FIN \n";
open (FH, "< coronavirus_cds/Spikes/Spikes_complete/sorted/Delta_spike_sorted.fasta") or die "unable 
to open FH \n";

while ($line=<FH>){
    if ($line =~ /^>/){
        chomp($line);
        $acc=substr($line,5,9);
        #print "$acc\n";
    }
    while ($string=<FIN>){
        if ($string =~ /^>/){
        chomp ($string);
        $gen=substr($string,12);
        #print "$gen\n";
    }       
       if ($acc =~ /\Q$string/){
           $line =~ s/$line/$gen/g;
        print "$acc\n";
       }
}

1 Ответ

1 голос
/ 07 августа 2020

Вот пример, в котором я сначала прочитал определения из второго файла в ha sh. Тогда вы избегаете перечитывать этот файл для каждой строки в первом файле:

use feature qw(say);
use strict;
use warnings;

{  # <-- scope to prevent local lexical variable to 'leak' into subs below
    my $map = read_fin("Delta_final.fasta");
    my $fn = 'Delta_spike_sorted.fasta';
    open (my $fh, '<', $fn) or die "unable to open file '$fn': $! \n";

    while (my $line=<$fh>) {
        chomp $line;
        if ($line =~ /^>/){
            my $acc = substr $line,5,10;
            if (exists $map->{$acc}) {
                say ">$map->{$acc}";
                next;
            }
        }
        say  $line;
    }
    close $fh;
}

sub read_fin {
    my ($fn) = @_;

    my %map;
    open ( my $fh, '<', $fn ) or die "Could not open file '$fn': $!";
    while( my $line = <$fh> ) {
        chomp $line;
        if ( $line =~ /^>((?:\S){10})\s+(\S.*)$/ ) {
            $map{$1} = $2;
        }
    }
    close $fh;
    return \%map;
}

Вывод :

>Porcine coronavirus HKU15 strain KY4813, complete genome
AAAAA
>Magpie-robin coronavirus HKU18 strain HKU18-chu3, complete genome
GGGGG
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...