2016-05-25 16 views
2

Ich führe eine Regex-Suche durch und möchte nur die Treffer im Fasta-Format ausdrucken (zwei Zeilen Daten: der erste beginnt mit einer Karotte ">" gefolgt vom Treffer und der zweiten Zeile) ohne Karotte, aber immer noch die Trefferinformationen enthalten).
Ich kann erfolgreich eine Ausgabe Multifasta-Datei erstellen, aber die Karotte und Zeilenumbrüche sind in der Ausgabedatei enthalten, ob es einen Treffer gibt oder nicht.Leere Regex-Treffer aus einem Array entfernen

Erzeugte Ausgabe:

> 

    > 

    >TAGCTAGC 
    TAGCTAGC 
    > 

    >GCTAGCTA 
    GCTAGCTA 

gewünschte Ausgabe:

>TAGCTAGC 
    TAGCTAGC 
    >GCTAGCTA 
    GCTAGCTA 

Hier ist mein Code:

#!/usr/bin/perl 
    use warnings; 
    use strict; 

    open(CLUSTER, ">", "SequencesToCluster.txt") or die $!; 

    my @TrimmedSequences; 

    my @ArrayofFiles = glob ("~/BLASTdb/Individual_Sequences_*"); 

    foreach my $file (@ArrayofFiles){ 
     open (my $sequence, $file) or die "can't open file: $!"; 
     while (my $line = <$sequence>){ 
      if ($line !~/^>/){ 
      my $seq = $line; 
      $seq =~ s/\R//g; 
      $seq =~ m/([TAGC]{16})(CGGAGCTTTA|GCCATTTCT|TAAAGCTCCG|AGAAATGGGC/; 
      push(@TrimmedSequences, ">", $1, "\n", $1, "\n"); 
      } 
     } 
    } 
    #Here I believe I need to manipulate the array to get rid of blank fastas 
    print CLUSTER @TrimmedSequences; 
+1

Sie könnten überprüfen, dass '$ 1' in Ihrer inneren while-Schleife definiert ist, und nicht die leeren Zeilen an erster Stelle schieben. –

+0

Dein letztes '$ seq = ~' scheint eins zu fehlen ')' –

+0

Es ist immer gut, ein zweites Paar Augen zu haben, die mein Tippen überprüfen! Entschuldigung für den Tippfehler. Guter Fang. – Rob

Antwort

5

Wenn Sie ein Array sind Filterung, das Werkzeug ist grep.

z.

my @new_array = grep { not /^\s*$/ } @old_array; 

Dies wird jedes Element filtern, das nur Leerzeichen ist. In Ihrem Fall, da es leer ist oder nur ein >:

/^>?\s*$/ statt.

Allerdings behebt das ein Problem, das nicht in erster Linie existieren muss. Sie könnten stattdessen:

$seq =~ m/([TAGC]{16})(CGGAGCTTTA|GCCATTTCT|TAAAGCTCCG|AGAAATGGGC)/ 
     && push(@TrimmedSequences, ">", $1, "\n", $1, "\n"); 

Und das wird nur push wenn die Regex-Übereinstimmungen.

+0

Ehrfürchtig. Vielen Dank! – Rob

+0

@Rob, wenn die Antwort Ihnen geholfen hat, das Problem zu lösen, bitte akzeptieren Sie die Antwort. Dies wird anderen Benutzern mit demselben Problem helfen, die Lösung schnell zu finden. – SilentMonk

Verwandte Themen