|
|
 |

|

 |

| Community » Perl: Allgemeines Forum |
|
hilfe um file ändern,
|
Seitenanfang |
| ich habe die folgende daten in der datei: >gi8886141|gb|AAF80385.1| carbofuran hydrolase MALNRIKNSNPSTLPPETPGEGPFMHEHQADILKWIRLADDVYRFRD das sind 2 zeilen, und mein wunsch wäre die datei aufzumachen dann ändern in dem so aussieht wie unten, das sind natürlich viele so in der datei drin. >gi8886141 (|gb|AAF80385.1|) carbofuran hydrolase irgendein parse rule, wäre cool, da ich noob bin würde ich mich auf eine ausführliche hilfe. danke an alleeee im voraus
Datum: 28.06.2007-18:20

|
re: hilfe um file ändern,
|
Seitenanfang |
Der Regexp koennte so aussehen
#!/usr/bin/perl use strict; use warnings; my $str = 'gi8886141|gb|AAF80385.1| carbofuran hydrolase'; # nur finden if(my(@matches) = $str =~ m/^(gi\d+?)(\|.+$)/) { print "$_\n" for @matches; } # oder im String ersetzen $str =~ s/^(gi\d+?)(\|.+?\|.+?\|)\s+?(.+?)/$1 ($2) $3/g; print $str, "\n";
Datum: 29.06.2007-13:28

|
re: hilfe um file ändern,
|
Seitenanfang |
coool echt vielen dank was ich verstanden habe daunten, du pushst quasi den Array @matches,und dann läst es ausgeben,oder?# nur finden if(my(@matches) = $str =~ m/^(gi\d+?)(\|.+$)/) { print "$_\n" for @matches; } thx
Datum: 29.06.2007-14:08

|
re: hilfe um file ändern,
|
Seitenanfang |
Wenn der Regexp zutrifft dann werden die Teile des Regexp die von runden Klammern umschlossen (gruppiert) sind in den Variablen $1, $2, $3, etc. gespeichert, wenn man den Regexp im Listenkontext auswertet, werden diese gespeicherten Werte als Liste zurueckgeben, die man dann in einem Array speichern kann. # Regexp im Listenkontext (@matches (Arrayvariable) => Liste) my @matches = $text =~ m/(\w+?)/g;# Regexp im Skalarkontext ($match_count (Skalarvariable) => Skalarkontext) my $match_count = $text =~ m/(\w+?)/g;
Im Listenkontext erhaelst du eine Liste von den Textteilen auf die das Muster zugetroffen hat, im Skalarkontext erhaelst du die Anzahl der Treffer.Da wird nichts ins Array gepusht, die Liste wird dem Array zugewiesen, beim push wird's angehangen.
# Ausgangsarray my(@array) = ('aaa', 'bbb');# beim pushen push(@array, ('ccc', 'ddd')); print "@array\n"; # Ausgabe: aaa bbb ccc ddd # Ausgangsarray my(@array) = ('aaa', 'bbb'); # bei einer Zuweisung @array = ('ccc', 'ddd'); print "@array\n"; # Ausgabe: ccc ddd
Datum: 29.06.2007-15:06

|
re: hilfe um file ändern,
|
Seitenanfang |
alles klar, so jetzt ich hab die zweite variante genommen,im string ersetzen meine ich:$_ =~ s/^(gi\d+?)(\|.+?\|.+?\|)\s+?(.+?)/$1 ($2) $3/g; meine txt Datei besteht aus vielen zeilen die so aussehen: >gi113|Histone K17di [Homo sapiens] APAEKTPVKKGC >gi11998|Histone K17di [Homo sapiens] APAEKTPVKKGC >gi1666|Histone K17di [Homo sapiens] APAEKTPVKKGC ..etc immer die erste Zeile die den muster erfüllt >gi... und die zweite(sind auch mehrere) mit gross Buchstaben diese txt datei(vorallem die erste zeile) möchte ich jetzt komplett ersetzen in allesn zeilen die vorkommen, ich glaub ich muss es in ein Array einlesen oder? my $myfile= 'C:/Documents and Settings/XXX/Desktop/YYY/test.txt'; open (FILE, "$myfile") || die "Can't open '$myfile': $!\n"; my @parse = <FILE>; close(FILE); foreach (@parse) { chomp; $_ =~ s/^(gi\d+?)(\|.+?\|.+?\|)\s+?(.+?)/$1 ($2) $3/g; dann????
Datum: 29.06.2007-15:31

|
re: hilfe um file ändern,
|
Seitenanfang |
Das ginge in einen Perleinzeiler recht gut:
$ perl -i.bak -wpe 's/^(gi\d+?)(\|.+?\|.+?\|)\s+?(.+?)/$1 ($2) $3/' -- test.txt
Wuerde die Ersetzung fuer jede Zeile in der Datei test.txt vornehmen, legt die Originaldatei als Sicherungskopie test.txt.bak ab.Unter Windows, in der Eingabeaufforderung, sind die Apostrophen (') durch Anfuehrungszeichen zu ersetzen. Andernfalls, wenn die Datei auch nicht zu grosz sein sollte, oeffnest du die Datei lesend, dann kannst du alle Zeilen in ein Array einlesen, Datei schlieszen. Das Array entsprechend bearbeiten, Datei erneut (aber schreibend) oeffnen und das Array komplett hineinschreiben. Oder du verwendest eine temporaere Datei: Ursprungsdatei oeffnen, Datei in einer while-Schleife Zeile fuer Zeile durchlaufen, Text ersetzen und jede Zeile in eine andere (temporaere Datei) ausgeben. Hat den Vorteil dass du noch eine Sicherungskopie der Originaldatei hast.
Datum: 29.06.2007-21:13

|
re: hilfe um file ändern,
|
Seitenanfang |
| Hi dash, also wenn Du ihm so'n Kram zeigst, dann kannst ihm auch gleich sed näherbringen. *grins* Wär dann wahrscheinlich 'ne ganze Ecke schneller. $ sed -e '1,$ s/^(gi\d+?)(\|.+?\|.+?\|)\s+?(.+?)/$1 ($2) $3/' test.txt > test.txt.new
Hier wird die Original datei nicht verändert und das Ergebnis in der *.new gespeichert. *Nicht bös' gemeint!* -uw
Datum: 02.07.2007-23:08

|
re: hilfe um file ändern,
|
Seitenanfang |
alles klar danke ann alle; greezzii
Datum: 03.07.2007-01:21

|
re: hilfe um file ändern,
|
Seitenanfang |
Klares "Nööö"! Also erst einmal ist das hier ein Perl-Forum, also geht es hier in erster Linie um Loesungen durch Perl, egal ob oftmals mehrere durch Pipes kombinierte Shellcommands wesentlich kuerzer sein moegen (Beispiel 'File::Find' vs. 'find'), dein 'sed'-Beispiel ist es jedenfalls nicht :-P *g*Dazu kommt noch issaa hat vermutlich kein 'sed', denn wie die Beispiele zeigen werden Windows-Pfade verwendet und das ist ein weiterer Grund 'perl' fuer die Loesung zu verwenden, es ist plattformunabhaengig und bei den Fragenden installiert, zumindest gehe ich davon aus ;-) Ich hab mal dein sed-Command korrigiert:
$ sed -e 's/^\(gi[0-9]\+\?\)\(|.\+\?|.\+\?|\)\s\+\?\(.\+\?\)/\1 (\2) \3/' test.txt > test.txt.new
Jetzt sag mir welcher Befehl ist leichter lesbar, der perl- oder der sed-Befehl?/me meint es auch nicht boese
Datum: 03.07.2007-13:03

|
|

|

|

|
 |

|

|
|