Dateiinhalt sortiert ausgeben
Manfred Kuhn
- perl
0 Beat0 Patrick Andrieu0 Beat
Huhu,
tut mir leid das ich euch schon wieder auf die nerven fallen muss ;-)
Ich habe eine Datei, die in etwa so aussieht:
hans.3.dort
peter.1.drüben
ich.8.unten
du.19.oben
wir.3.woanders
usw
Jetzt möchte ich mir die Zeilen anzeigen lassen sortiert nach der Zahlengröße also ähnlich wie eine rangliste.
Ich bekomm es einfach nicht hin könntet ihr mir bitte nochmal helfen?
viele liebe grüße
Ich habe eine Datei, die in etwa so aussieht:
hans.3.dort
peter.1.drüben
ich.8.unten
du.19.oben
wir.3.woanders
uswJetzt möchte ich mir die Zeilen anzeigen lassen sortiert nach der Zahlengröße also ähnlich wie eine rangliste.
Ich bekomm es einfach nicht hin könntet ihr mir bitte nochmal helfen?
Es ist offensichtlich so, dass du
Also
my $cnt=0;
my %S;
while(<>){
/.(\d+)./ and $S{ $1. sprintf("%04d", ++$cnt) } = $_;
}
foreach (sort {$a <=> $b} keys %S){
print $S{$_};
}
oder so ähnlich...
mfg Beat
Hallo Manfred!
hans.3.dort
peter.1.drüben
ich.8.unten
du.19.oben
wir.3.woanders
usw
Jetzt möchte ich mir die Zeilen anzeigen lassen sortiert nach der Zahlengröße also ähnlich wie eine rangliste.
Ich bekomm es einfach nicht hin könntet ihr mir bitte nochmal helfen?
Wenn es Dir nur darum geht, die Zeilen anhand der enthaltenen Zahl zu sortieren, hilft die Schwartz'sche Transformation (Schwartzian Transform):
C:>perl -w
my @ar = <DATA>;
@ar = map { $_->[0] }
sort { $a->[1] <=> $b->[1] }
map { [ $_, ( /(\d+)/ )[0] ] } @ar;
foreach (@ar) {print $_}
__DATA__
hans.3.dort
peter.1.drüben
ich.8.unten
du.19.oben
wir.3.woanders
Ausgabe:
peter.1.drüben
hans.3.dort
wir.3.woanders
ich.8.unten
du.19.oben
Wenn die Zahlen zuerst erscheinen müssen (z.B. 1.peter.drüben) kannst Du das Ergebnis-Array nach Belieben erneut manipulieren.
@Beat: Kennst Du die Schwartz'sche Trafo genau so wenig wie Hotte?
Viele Grüße aus Frankfurt/Main,
Patrick
C:>perl -w
[code lang=perl]my @ar = <DATA>;
@ar = map { $_->[0] }
sort { $a->[1] <=> $b->[1] }
map { [ $_, ( /(\d+)/ )[0] ] } @ar;
foreach (@ar) {print $_}
@Beat: Kennst Du die Schwartz'sche Trafo genau so wenig wie Hotte?
Ich kenne Sie schon, gebrauche sie aber selten.
Besonders dein vorliegendes Beispiel ist ja für einen Neuling nicht so durchsichtig, indem du einen anonymen Array mit zwei Elementen erzeugst.
In der Tat nehme ich oft lieber einen Hilfshash.
Aber ich nehme die Transformation für dich mal auseinander
@ar = map { $_->[0] }
sort { $a->[1] <=> $b->[1] }
map { [ $_, ( /(\d+)/ )[0] ] } @ar;
wird zu
my @temp = map { [ $_, ( /(\d+)/ )[0] ] } @ar;
@temp = sort { $a->[1] <=> $b->[1] } @temp;
@ar = map { $_->[0] } @temp;
mfg Beat