Thread Komplexer sort (natürliche Sortierung) (13 answers)
Opened by Student87 at 2012-11-23 17:10

Linuxer
 2012-11-29 12:56
#163735 #163735
User since
2006-01-27
3875 Artikel
HausmeisterIn

user image
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
chrY
chrX
chrY
chrX
chrY
chrX
chrX
chr1
chr1
chr1
chr2
chr2
chr2
chr10
chr10
chr10
chr10


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!

View full thread Komplexer sort (natürliche Sortierung)