Thread Komplexer sort (natürliche Sortierung)
(13 answers)
Opened by Student87 at 2012-11-23 17:10
Hi, chrY und chrX werden nicht sortiert. Die werden in der Reihenfolge ausgegeben, wie sie in den originalen Daten stehen.
Guck mal (achte auf die Reihenfolge der chrX und chrY): Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 #! /usr/bin/perl use strict; #use warnings; my @list = qw( chr10 chr10 chr10 chr10 chrY chrX chrY chr1 chr1 chr1 chrX chrY chrX chrX chr2 chr2 chr2 ); my @sorted = sort { my ($chr_a, $num_a) = $a =~ m/^([a-z]+)(\d+)/; my ($chr_b, $num_b) = $b =~ m/^([a-z]+)(\d+)/; $chr_a cmp $chr_b || $num_a <=> $num_b } @list; print join "\n", @sorted; Ergebnis: Code: (dl
)
1 chrY Ergänzung: Schau Dir mal den Regex genau an: Code (perl): (dl
)
my ($chr_a, $num_a) = $a =~ m/^([a-z]+)(\d+)/; Der kommt nur zu einem Treffer, wenn mindestens ein Buchstabe (a-z) und mindestens eine Ziffer (\d = 0-9) vorhanden sind. Bei chrX oder chrY fehlt die Ziffer! Dadurch kommt es zu keinem Treffer und $chr_a und $chr_b bleiben ungefüllt (also undef). undef dürfte beim Stringvergleich wie ein Leerstring wirken; Leerstring (war chrX) zu Leerstring (war chrY) ist gleichwertig, also keine Umsortierung. Leerstring (chrX oder chrY) zu chr$Zahl dürfte bewirken, dass eben chrX oder chrY vor chr$Zahl sortiert wird. Last edited: 2012-11-29 13:16:47 +0100 (CET) meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen! |