Manfred Kuhn: Dateiinhalt sortiert ausgeben

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

  1. 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?

    Es ist offensichtlich so, dass du

    • Die Zahl extrahieren musst
    • einen Zähler hinzufügst mit sprintf und führenden 0en  gepadded.
    • so dass du hast:18001, 9002, 3003, 17004
      Diese Zahl kannst du dann als Key eines hashes verwenden
      Der Wert des Hashelements ist dein originales Datum.
      Dann kannst du die hashkeys sortieren.
      Und die sortierten Hashwerte ausgeben

    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

    --
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    Der Valigator leibt diese Fische
  2. 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

    --
    _ - jenseits vom delirium - _

       Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
    J'ai 10 ans! | Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
    1. 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

      --
      Woran ich arbeite:
      X-Torah
      ><o(((°>           ><o(((°>
         <°)))o><                     ><o(((°>o
      Der Valigator leibt diese Fische