tutorials.de Buch-Aktion 05/2012
Seite 2 von 2 ErsteErste 12
ERLEDIGT
JA
ANTWORTEN
18
ZUGRIFFE
1763
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #16
    Pauline25 Pauline25 ist offline Mitglied
    Registriert seit
    Aug 2011
    Beiträge
    11
    Es hat sich erledigt, ich habe $1 hinter den if-Befehl gesetzt, jetzt geht es. Hier die richtige Lösung, falls mal jemand ähnliche Probleme hat:

    Code perl:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    
     #!/usr/bin/perl
    use strict;
    use warnings;
     
    my $in;
    my $data;
    my @array;
    my $array;
    my $GeneID;
     
     
     
    open $in, '<', "Genomteil.gff" or die $!;
    while ($data = <$in>) {
        @array = split(/\t/, $data);
        
     if ($array [8] =~ /\.*\;db_xref=GeneID:(\d+)\n/) 
     
    {$GeneID = $1; 
     
     
    print $GeneID;
     
    };
    } 
                                        
                                    
    close $in;

    Vielen Dank für die Hilfe.
    LG
    Geändert von Pauline25 (09.08.11 um 09:20 Uhr)
     

  2. #17
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Noch ein Hinweis zu deinem reg. Ausdruck:
    Code :
    1
    
    /\.*\;db_xref=GeneID:(\d+)\n/
    Du beginnst mit \.* und hast dabei das "." Metazeichen entwertet. D.h. dieser Ausdruck passt auf eine beliebige Anzahl von Punkten (0 bis n). Du hast vor dem ;db_xref allerdings gar keine Punkte stehen.

    Da du den * Quantifizierer spezifiziert hast, spielt das keine Rolle, da ein leeres Wort in jedem Text enthalten ist und an jeder Stelle übereinstimmt.

    Meintest du evtl. einfach '.*' ?

    Dann wäre allerdings diese Angabe auch unnötig. Da .* einfach immer und überall paßt.

    Es reicht also aus zu schreiben: /;db_xref=GeneID:(\d+)\n/ Das kommt exakt auf's Gleiche raus, du hast es nur komplizierter ausgedrückt.

    (ein Semikolon mußt du nicht entwerten, es ist kein Metazeichen)

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #18
    Pauline25 Pauline25 ist offline Mitglied
    Registriert seit
    Aug 2011
    Beiträge
    11
    Hm, aller Anfang ist schwer. Hast vollkommen recht mit den Anmerkungen. Ich meinte tatsächlich '.*' und ja, es ist total überflüssig in diesem Fall - hätt ich aber selbst merken sollen.
    Danke für die super Hilfe!! Jetzt mach ich mich an den nächsten Schritt....

    LG
     

  4. #19
    Pauline25 Pauline25 ist offline Mitglied
    Registriert seit
    Aug 2011
    Beiträge
    11
    Ein paar Schritte weiter und schon taucht das nächste Problem auf! Hier noch mal ein Auszug der Textdatei, die ich bearbeiten möchte:

    NC_014171.1 RefSeq gene 14311 14425 . + . ID=NC_014171.1:rrs_1;locus_tag=BMB171_C5091;db_xref=GeneID:9190898
    NC_014171.1 RefSeq exon 14311 14425 . + . ID=NC_014171.1:rrs_1:unknown_transcript_1;Parent=NC_014171.1:rrs_1;gbkey=rRNA;locus_tag=BMB171_C5091 ;product=5S ribosomal RNA;db_xref=GeneID:9190898;exon_number=1
    NC_014171.1 RefSeq gene 14459 15460 . - . locus_tag=BMB171_C0007;db_xref=GeneID:9190899
    NC_014171.1 RefSeq CDS 14462 15460 . - 0 locus_tag=BMB171_C0007;transl_table=11;product=hypothetical protein;protein_id=YP_003662545.1;db_xref=GI:296500845;db_xref=GeneID:9190899;exon_number=1

    Für meine Frage muss ich wohl etwas ausholen, also hier das gesamt Skript mit Kommentaren:

    Code perl:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    
    # Task: Extract GeneID-Number from the .Gff file
     
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    my $in;
    my $data;
    my @array;
    my $array;
    my $GeneID;
    my @BMB;
    my $BMB;
    my $flag = 0;
    my %hash;
    my $hash;
     
     
    # 1) open the .gff Inputfile and while reading line by line split $data at each tab and put them in the @array
     
     
    open $in, '<', "Genomteil.gff" or die $!;
     
    while ($data = <$in>) {
        
        @array = split(/\t/, $data);
     
    if ($array [2] =~/gene/){           #wenn 'gene auftaucht, anfangen Daten zu extrahieren)
        $flag = 1;
     
        @BMB = ($array[3], $array[4], $array[6]); #extrahierte Daten in neues Array, das später als value ins Hash gespeichert wird
     
        
    }
     
     
     
    if  ($array[2] =~/CDS/){
     
        push (@BMB, $array[2]);
        
                            #weitere Daten des zu bearbeitenden Blockes extrahieren und Array hinzufügen
     
    } elsif ($array[2] =~/exon/){
     
        push (@BMB, $array[2]);
        
    }
        
     
    if  ($array[8] =~ /.*;db_xref=GeneID:(\d+)\n/) { #wenn GeneID auftaucht, die folgende Nummer extrahieren und als Key in Hash einfügen. Dann das @BMB mit den values zum Hash hinzufügen 
     
        $GeneID = $1; 
            
        @{$hash {$GeneID}} = @BMB;
        
    }   
     
     
        
    if   ($array [8]=~ /.*;exon_number=1/){ #hier endet der Block mit den wichtigen Daten des ersten Teils meiner Datei
          $flag = 0;
         
    }
     
    }
     
        close $in;
     
    while ( ($GeneID, $BMB) = each %hash) {
    print "$GeneID => $BMB[0]\n";
    }

    So, nun meine Erkenntnis: Skript funktioniert soweit, mein Array @BMB wird aber immer wieder mit den Werten des nächsten Abschnitts überschrieben, so dass am Ende nur noch die Daten des letzten Blockes übrig sind (die keys werden allerding alle im Hash gespeichert). Meine Aufgabe um dieses Problem zu lösen lautet nun explizit: Baue einen zweiten flip-flop ein, damit die beiden immer abwechselnd angesprochen werden. Also flip-flop 1 spricht die Daten des ersten Blockes an, und speichert alles im Array, flip-flop 2 erkennt dann, das ein neuer Block mit neuen Daten kommt u.s.w.
    Hab mich jetzt durch etliche Foren etc. gegoogelt, aber immer noch keine Idee, wie ich das ins Skript einbauen soll.

    Weiß jemand Rat?

    Danke euch schon mal.

    Lieben Gruß
     

Ähnliche Themen

  1. [Batch] aus einer datei ein bestimmtes wort auslesen?
    Von Nawi0 im Forum Sonstige Sprachen
    Antworten: 1
    Letzter Beitrag: 20.11.09, 12:50
  2. Bestimmtes Wort aus Listbox löschen
    Von Mailyn im Forum Visual Basic 6.0
    Antworten: 4
    Letzter Beitrag: 26.12.06, 00:16
  3. Bestimmtes Wort auslesen
    Von Sandro18 im Forum PHP
    Antworten: 2
    Letzter Beitrag: 15.09.05, 19:24
  4. Antworten: 2
    Letzter Beitrag: 18.01.05, 23:02
  5. [perl] file durchsuchen und bestimmtes wort ersetzen
    Von alie im Forum CGI, Perl, Python, Ruby, Power Shell
    Antworten: 1
    Letzter Beitrag: 19.04.02, 12:04