Ich würde - wie ich es oft tue - vorschlagen perl
.
perl
hat eine Sortierfunktion, mit der Sie eine Vergleichsfunktion angeben können. Diese Vergleichsfunktion ist jeder Test, der zwei Werte annimmt, und kehrt -1
, 0
oder 1
je nach Relativposition.
Es wiederholt die Liste, wobei jeder Wert als $a
und festgelegt wird $b
und der Test für jedes Element durchgeführt wird.
Also standardmäßig:
$a cmp $b
zum stringweisen Vergleich oder sort { $a <=> $b }
zum numerischen Vergleich .
Infolgedessen können Sie jedoch beliebig komplexe benutzerdefinierte Sortierkriterien anwenden:
#!/usr/bin/perl
use strict;
use warnings;
sub sort_by_sc {
my ( $a_sc ) = $a =~ m/SC(\d+)/;
my ( $b_sc ) = $b =~ m/SC(\d+)/;
return $a_sc <=> $b_sc;
}
my @file_list = qw (
ABC38388.SC01.StatueGrade_MKP
ABC38388.SC02.Statue_GKP
DEF38389.SC03.Statue_HKP
XYZ38390.SC00.Statue_WKP
);
print sort sort_by_sc @file_list;
Oder auf einen Einzeiler, eine Lesung STDIN
oder eine Datei reduziert (Zeilenvorschub getrennt, was normalerweise gut genug ist):
perl -e 'print sort {@x = map {/SC(\d+)/}($a,$b); $x[0] <=> $x[1]} <>'
Sie können es stattdessen mit dem Ergebnis glob
eines Verzeichnismusters füttern :
perl -e 'print sort {@x = map {/SC(\d+)/}($a,$b); $x[0] <=> $x[1]} glob ( "*SC*")'