perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 23
Click for quality!




11.02.2012 / 06:45

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


Beitraghilfe 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: hilfe um file ändern,
Seitenanfang
alles klar danke ann alle;
greezzii

Datum: 03.07.2007-01:21

Beitragre: 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

-






-
-