ERLEDIGT
JA
JA
ANTWORTEN
18
18
ZUGRIFFE
2933
2933
EMPFEHLEN
-
05.08.11 16:50 #1
Mitglied
- Registriert seit
- Aug 2011
- Beiträge
- 11
Hallo zusammen. Habe gerade damit begonnen mir Perl bei zu bringen und stecke jetzt in einem Skript fest. Ich möchte Daten aus einer Textdatei splitten und aus dem mit den substrings befüllten Array ein ganz bestimmtes Wort rausholen. Das Splitten funktioniert (hab ich seperat getestet). Dass Wort, das ich suche ist im 8. substring, heißt "GeneID" und liegt immer zwischen anderen Werten. Also wie gesagt, bis zum splitten funktionierte es noch, aber jetzt muss irgendwo ein Fehler drin sein:
#!/usr/bin/perl
use strict;
use warnings;
my $in;
my $data;
my @array;
my $key;
my $slice;
my $array;
open $in, '<', "Genomteil.gff" or die $!;
while ($data = <$in>) {
chomp $data;
@array = split(/\t/, $data);
$slice = ($array [8] => ~/\bGeneID\b/i);
}
print $slice;
close $in;
Würd mich freuen, wenn jemand einen Tipp hätte.
LG
-
08.08.11 08:14 #2
Mitglied Brokat
- Registriert seit
- Jan 2004
- Beiträge
- 332
Wenn es die 8. Spalte ist, dann musst Du $array[7] schreiben, weil die Arrayelemente bei 0 anfangen:
Code :1 2 3
@array = ( 'element1', # $array[0] 'element2', # $array[1] ...
-
08.08.11 09:10 #3
Mitglied
- Registriert seit
- Aug 2011
- Beiträge
- 11
Sorry, war nicht so ganz klar ausgedrückt. Das Wort ist definitiv im $array [8], dass die Elemente bei 0 anfangen, hatte ich bedacht. Ich dachte der Fehler liegt in der Angabe ~/\bGeneID\b/i.
Hat jemand ne Idee?
-
08.08.11 11:19 #4
Mitglied Diamant
- Registriert seit
- Jun 2005
- Beiträge
- 8.540
Hi.
Dir ist aber schon bewußt, das du den Wert von $slice nur einmal nach der Schleife ausgibst, also erst wenn die ganze Datei verarbeitet wurde?
Was möchtest du denn mit dieser Zeile bezwecken? Möchtest du evtl. einfach $array[8] an \bGeneID\b splitten?
Zitat von Pauline25
Verwende bitte die Code-Tags! Und mach doch einfach mal ein konkretes Beispiel, mit Eingabedatei und was du dann gerne als Ausgabe haben würdest...
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
08.08.11 11:34 #5
Mitglied Brokat
- Registriert seit
- Jan 2004
- Beiträge
- 332
Bei so etwas wäre es dann gut, wenn Du eine Ausgangsdatei postest und beschreibst, was Du am Ende haben willst (das könntest Du jetzt ja noch nachholen).
Das mit dem Index, der bei 0 anfängt, ist ein beliebter Fehler bei Einsteigern.
Ansonsten fällt mir die Zeile
Code :1
$slice = ($array [8] => ~/\bGeneID\b/i);
auf.
Du meinst wohl eher das hier:
Code :1
$slice = $array[8] if $array[8] =~ /\bGeneID\b/i;
-
08.08.11 13:00 #6
Mitglied
- Registriert seit
- Aug 2011
- Beiträge
- 11
Danke schon mal für die Antworten und auf euren Rat noch mal ganz von vorne.
Die Zeilen meine Ausgangsdatei siehen so aus:
Zeile 1: NC_014171.1 RefSeq gene 9197 10736 . + . ID=NC_014171.1:rrf_1;locus_tag=BMB171_C5089;db_xref=GeneID:9191048
Zeile 2: NC_014171.1 RefSeq gene 1802 2947 . + . ID=NC_014171.1:dnaN1;locus_tag=BMB171_C0002;db_xref=GeneID:9191043
Aus dieser Datei möchte ich jeweils die Zeichenkette "GeneID:91910XY" extrahieren (mit diesem Wert möchte ich später weiterarbeiten, dass ist aber jetzt egal-das möchte ich zunächst selbst versuchen. Also vergesst ruhig, dass ich mit meinem Skript nur den letzten Wert nach Ende der Schleife ausgeben kann!)
Mein aktuelles Skript sieht jetzt so aus:
#!/usr/bin/perl
use strict;
use warnings;
my $in;
my $data;
my @array;
my $key;
my $slice;
my $array;
my @geneID;
open $in, '<', "Genomteil.gff" or die $!;
while ($data = <$in>) {
chomp $data;
@array = split(/\t/, $data);
if (my $array = ~ /[\d,\w,\s,]* "; db_xref=GeneID: [d*]\n/) {
print '$1';
}
};
close $in;
Im Prinzip möchte ich sagen: wenn du folgendes findest: xy Anzahl von Buchstaben, Zeichen, Zahlen und danach den Marker: ; db_xref=GeneID:, dann extrahiere mir die darauf folgende Zahlenfolge!
Okay, ich hoffe damit kann jetzt einer was anfangen. Danke euch.
LG
-
08.08.11 13:26 #7
Mitglied Diamant
- Registriert seit
- Jun 2005
- Beiträge
- 8.540
Bitte benutze die Code-Tags! Schreibe einfach [perl] ... [/perl] um deinen Code. Dann bleiben auch die Einrückungen erhalten.Code perl:1
my $db_xref = $1 if ($array[8] =~ /(GeneID:\d+));
Es ist unsinnig in einer Zeichenklasse Zeichen zu wiederholen. Und was ist "[d*]"? Meintest du evtl. \d+? Und das \n ist nach einem chomp nicht mehr in deinem String enthalten, so dass der reg. Ausdruck nie mit dem Text übereinstimmen dürfte
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
08.08.11 13:52 #8
Mitglied
- Registriert seit
- Aug 2011
- Beiträge
- 11
okay, dass war einiges, was ich überarbeiten muss. ich werd es mal umbauen.
vielen lieben dank!
gruß
-
08.08.11 15:54 #9
Mitglied
- Registriert seit
- Aug 2011
- Beiträge
- 11
Okay, soweit ist es umgebaut - leider funtioniert es immer noch nicht, wie es soll.
Ich habe die konkrete Vorgabe etwas wie das hier zu programmieren:
Code perl:1
my $GeneID = $1 if ($array [8] = ~ /\w+\W+;db_xref=GeneID:(\d+)\n/)
# w+/W+ :in $array [8] kommt zunächst eine unbestimmt lange Folge von Buchstaben, Zeichen und Zahlen
# ;db_xref=GeneID: dann kommt der immer gleiche Marker, der immer vor der zu extrahierenden Zahlenfolge steht
#(\d+) hier ist die Zahlenfolge, die ich extrahieren will
# abschließend folgt ein Zeilenumbruch
chomp hab ich rausgenommen, ich vermute dass irgendwas mit der syntax nicht stimmt, finde aber nirgends Beispiele, bei denen nach so genauen Vorgaben extrahiert wird.
LG
-
08.08.11 16:17 #10
Mitglied Diamant
- Registriert seit
- Jun 2005
- Beiträge
- 8.540
Ich sehe jetzt nicht wo der Fehler liegt. Ich kann es aber auch nicht ausprobieren. Häng doch mal eine (minimale) Beispieldatei an und poste deinen konkreten Code so wie er jetzt aussieht.
Und es sieht so aus, als ob du den Operator =~ auseinandergeschrieben hast; = ~ ist nicht dasselbe wie =~.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
08.08.11 16:23 #11
Mitglied
- Registriert seit
- Aug 2011
- Beiträge
- 11
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
#!/usr/bin/perl use strict; use warnings; my $in; my $data; my @array; my $array; open $in, '<', "Genomteil.gff" or die $!; while ($data = <$in>) { @array = split(/\t/, $data); # w = word character [A-z, 0-9] # W = non word charcter # * = must occour 0 or more times # d = same as [0-9] # + = 1 or more times my $GeneID = $1 if ($array [8] =~ /\w+\W+;db_xref=GeneID:(\d+)\n/) print $1; }; close $in;
=~ hab ich jetzt zusammen.
Beispieldaten:
NC_014171.1 RefSeq gene 283 1623 . + . ID=NC_014171.1:dnaA;locus_tag=BMB171_C0001;db_xref=GeneID:9196130
NC_014171.1 RefSeq gene 1802 2947 . + . ID=NC_014171.1:dnaN1;locus_tag=BMB171_C0002;db_xref=GeneID:9191043
Gruß
-
08.08.11 17:07 #12
Mitglied Diamant
- Registriert seit
- Jun 2005
- Beiträge
- 8.540
Dein Programm ist ungültig. (Syntaxfehler)
Dann kann dein reg. Ausdruck keinesfalls zutreffen. Du spezifizierst, das vor ";db_xref=GeneID" (mind.) ein non-word Zeichen und davor (mind.) ein word Zeichen stehen soll.
In deinen Daten steht aber vor ";db_xref=GeneID" ein word Zeichen, kein non-word Zeichen.
Wolltest du evlt. eine Alternative, a la (a|b) angeben?
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
08.08.11 17:34 #13
Mitglied
- Registriert seit
- Aug 2011
- Beiträge
- 11
Ah, verstehe. Ich probiere es mal mit der Alternative.
Vielen Dank erst mal.
LG
-
08.08.11 18:28 #14
Mitglied Diamant
- Registriert seit
- Jun 2005
- Beiträge
- 8.540
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
09.08.11 08:41 #15
Mitglied
- Registriert seit
- Aug 2011
- Beiträge
- 11
Ja, das stimmt. Ich habe es jetzt mit .* probiert:
Code perl:1 2
my $GeneID = $1 if ($array [8] =~ /\.*;db_xref=GeneID:(\d+)\n/) print $GeneID; };
Das trifft es wohl eher. Trotzdem stimmt irgendwas noch nicht. Anscheinend gibt es in der Zeile oben noch einen Syntax Fehler (nähe print), den ich nicht sehe.
LG
Ähnliche Themen
-
[Batch] aus einer datei ein bestimmtes wort auslesen?
Von Nawi0 im Forum Sonstige SprachenAntworten: 1Letzter Beitrag: 20.11.09, 12:50 -
Bestimmtes Wort aus Listbox löschen
Von Mailyn im Forum Visual Basic 6.0Antworten: 4Letzter Beitrag: 26.12.06, 00:16 -
Bestimmtes Wort auslesen
Von Sandro18 im Forum PHPAntworten: 2Letzter Beitrag: 15.09.05, 19:24 -
Text-Datei in ein Array einlesen und auf ein bestimmtes Wort darin überprüfen
Von freaking out im Forum PHPAntworten: 2Letzter Beitrag: 18.01.05, 23:02 -
[perl] file durchsuchen und bestimmtes wort ersetzen
Von alie im Forum CGI, Perl, Python, Ruby, Power ShellAntworten: 1Letzter Beitrag: 19.04.02, 12:04




Zitieren
Login