Soriteren wie in unix "sort"
Holgi
- perl
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
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.
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
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.
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
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