perl problema para obter o resultado desejado

0
nameFile
seq_1014
seq_1039
seq_2848
seq_3213
seq_6847
seq_6980
seq_6997
seq_9319
seq_9561
seq_9850
# outputFile
>seq_1014
>seq_1039
>seq_2848
>seq_3213
>seq_6847
>seq_6980
>seq_6997
>seq_9319
>seq_9561
>seq_9850
>seq_10140
>seq_10141
>seq_10142
>seq_10143
>seq_10144
>seq_10145
>seq_10146
###Scriptuse

#!/usr/bin/env perl
my $list_file = $ARGV[0];
my $fasta_in = $ARGV[1];
my $fasta_out = $ARGV[2];
open(LIST_FILE, "<", $list_file) or die "could not open '$list_file' : $! \n";
open(FASTA_IN, "<", $fasta_in) or die "could not open '$fasta_in' : $! \n";
open(FASTA_OUT, ">", $fasta_out) or die "could not open $fasta_out : $! \n";
my @headers = ();
while(<LIST_FILE>) {
    chomp;
    next if ( /^\s*$/ );
    push(@headers, $_);
}
my $pat = join '|', map quotemeta, @headers;
$/ = ">";
while(<FASTA_IN>) {
    chomp;
    if ( /$pat/ ) { print FASTA_OUT ">$_"; }
}
close(LIST_FILE);
close(FASTA_IN);
close(FASTA_OUT);

Problema é uma saída indesejada

>seq_10140
>seq_10141
>seq_10142
>seq_10143
>seq_10144
>seq_10145
>seq_10146

Eu só quero os nomes exatos para combinar e grep fasta seqüências, mas este script está bagunçando como eu só quero seq_1014 e também dá

>seq_10140
>seq_10141
>seq_10142
>seq_10143
>seq_10144
>seq_10145
>seq_10146

Como posso corrigir esse script para obter a saída desejada

    
por star 04.05.2017 / 03:47

1 resposta

0

Então, dois problemas:

  1. Correspondências indesejadas: Isso porque você não terminou cada cláusula do padrão para ter $ no final para indicar que deseja corresponder a abced seguido por < b> nada . seq_10140 faz corresponder seq_1014 porque seq_1014 está lá (em algum lugar). Você não disse que outro personagem no final causaria uma falha dizendo seq_1014 $ .
  2. Falha ao corresponder quando deveria: Esta parte funciona no meu sistema quando copio seu código e seus arquivos de entrada. 1039 e assim por diante do correspondem. Tudo o que posso pensar é que o seu $ pat é apenas uma cláusula de duração devido a algum problema com o seu arquivo de padrão que está sendo corrigido cortando-o e colando-o dentro e fora deste fórum. Geralmente, isso significa que há dois caracteres End of Line no final de cada linha a la no DOS e o arquivo inteiro é lido na primeira leitura. Há, no entanto, uma série de outras coisas que poderiam estar erradas com elas. Leve-o para a depuração ou apenas adicione instruções de impressão para ver o que está em @headers e $ pat . Obtenha uma saída byte-by-byte do arquivo através de um programa 'C' ou Emacs em 'hexl-mode' para ver se algo está confundindo suas leituras.
por 13.05.2017 / 00:30