Holgi: Soriteren wie in unix "sort"

Hi zusammen,

ich hab folgende Liste:
106 - CL1-A - BC
106 - CL2-A - BC
104 - CL1-A - BD
78 - CL5-A - BE
79 - CL5-A - BF
81 - CL3-A - C5
7 - CL1-A - C6
7 - CL2-A - C6
105 - CL1-A - C7
106 - CL1-A - C8
106 - CL2-A - C8

Jetzt möchte ich diese unique nach dem dritten Feld (hier: C5)sortieren.
Quasi wie in unix, das
#sort -t"-" -k3 -u

Ergebnis:
106 - CL1-A - BC
104 - CL1-A - BD
78 - CL5-A - BE
79 - CL5-A - BF
81 - CL3-A - C5
7 - CL1-A - C6
105 - CL1-A - C7
106 - CL1-A - C8

Gibt es da in Perl eine Funktion für oder ein Modul oder hat mir jemand eine Idee wie ich das geschickt anstellen könnte ?
Danke.

Holger

  1. Gibt es da in Perl eine Funktion für oder ein Modul oder hat mir jemand eine Idee wie ich das geschickt anstellen könnte ?

    Kommt drauf an, denn "ich habe folgende Liste" ist keine Perl Listen sondern einfach ein Text, wenn du uns nicht verrätst, wie deine Daten vorliegen kann dir auch keiner sagen wie du sortieren sollst.

    Wobei sort auch in perl existiert

    Struppi.

    --
    Javascript ist toll (Perl auch!)
    1. Gibt es da in Perl eine Funktion für oder ein Modul oder hat mir jemand eine Idee wie ich das geschickt anstellen könnte ?

      Kommt drauf an, denn "ich habe folgende Liste" ist keine Perl Listen sondern einfach ein Text, wenn du uns nicht verrätst, wie deine Daten vorliegen kann dir auch keiner sagen wie du sortieren sollst.

      Wobei sort auch in perl existiert

      Struppi.

      Merci, für den Link.
      Die Daten hab ich z.Zt. in einem Array
      106 - CL1-A - BC
      106 - CL2-A - BC
      104 - CL1-A - BD
      78 - CL5-A - BE
      79 - CL5-A - BF
      81 - CL3-A - C5
      7 - CL1-A - C6
      7 - CL2-A - C6
      105 - CL1-A - C7
      106 - CL1-A - C8
      106 - CL2-A - C8

      [0] =  106
      [1] = CL1-A
      [2] = BC
      [3] =  106
      [4] = CL2-A
      [5] = BC
      usw ..

      ciao
      Holger

      1. Die Daten hab ich z.Zt. in einem Array
        106 - CL1-A - BC
        106 - CL2-A - BC
        104 - CL1-A - BD
        78 - CL5-A - BE
        79 - CL5-A - BF
        81 - CL3-A - C5
        7 - CL1-A - C6
        7 - CL2-A - C6
        105 - CL1-A - C7
        106 - CL1-A - C8
        106 - CL2-A - C8

        [0] =  106
        [1] = CL1-A
        [2] = BC
        [3] =  106
        [4] = CL2-A
        [5] = BC
        usw ..

        Das ist schlecht.
        Ich befürchte, du musst du dir selbst eine Routine schreiben, ich glaube nicht, dass es ein Modul o.ä. gibt, das "sortiere ein Array nach jedem dritten Element, wobei jeweils drei Elemente zusammengehören" kann oder du beschätigst dich mit Datenstrukuren
        http://perldoc.perl.org/perldsc.html
        http://perldoc.perl.org/perllol.html

        Struppi.

        --
        Javascript ist toll (Perl auch!)
      2. Gibt es da in Perl eine Funktion für oder ein Modul oder hat mir jemand eine Idee wie ich das geschickt anstellen könnte ?

        Dein Stichwort lautet Schwartzsche Transformation, siehe
        http://forum.de.selfhtml.org/archiv/2005/1/t99696/#m609430

        Die Daten hab ich z.Zt. in einem Array

        Dann schau in die dazu gehörende FAQ:
        http://perldoc.perl.org/perlfaq4.html#How-do-I-sort-an-array-by-(anything)%3F

        Das zusammengeführt ergibt (@unsorted ist dein Array):

        my @sorted = map  { $_->[0] }  
                     sort { $a->[1] cmp $b->[1] || $a->[2] cmp $b-> [2] }  
                     map  { [ $_, (split /\s-\s/)[1,2] ] } @unsorted;
        

        Den Code zu verstehen sollte nach Lektüre der Links kein Problem sein, ansonsten frage nochmal nach.

        Siechfred

        --
        Ich bin strenggenommen auch nur interessierter Laie. (molily)
        1. Oje, ich glaube, ich habe dich gründlich missverstanden. Zwar brauchst du in jedem Falle die Schwartzsche Transformation, aber in Perl gibt's natürlich ein Modul für solche Aufgaben: Sort::Array. Und weil ich so kolossal daneben lag, gleich noch ein praktisches Beispiel:

          use strict;  
          use diagnostics;  
          use Sort::Array qw(Sort_Table);  
            
          my @unsorted = ('Müller','Karl',82,  
                          'Müller','Karla',79,  
                          'Schulze','Maria',29,  
                          'Schulze','Karl',32,  
                          'Mayer','Dorothea',77,  
                          'Mayer','Karl',78,  
                          'Wichtig','Karl',66,  
                          'Wichtig','Karla',64  
                         );  
            
          my @sorted = Sort_Table( cols      => '3',  
                                   field     => '3',  
                                   sorting   => 'ascending',  
                                   structure => 'single',  
                                   data      => \@unsorted,  
                                 );  
            
          print join "\n", @sorted;
          

          Hoffe, dass es nun das ist, was du wolltest :)

          Siechfred

          --
          Ich bin strenggenommen auch nur interessierter Laie. (molily)