Obwohl ich es nicht empfehlen würde (angesichts der relativ einfachen Weiterleitung des Ergebnisses über einen externen sort
Befehl), können Sie dies zumindest mit neueren Versionen von GNU awk (mindestens 4.0 IIRC) tun, wie unter Sortieren von Array-Werten und -Indizes mit gawk beschrieben
So können Sie es implementieren, vorausgesetzt, Sie haben die Daten in einem assoziativen Array, in dem sich der Index befindet Firstname Lastname
. Zuerst müssen Sie eine benutzerdefinierte Vergleichsfunktion definieren, die den Index aufteilt, zuerst vergleicht und Lastname
dann (als Tie Breaker) Firstname
z
function mycmp(ia, va, ib, vb, sa, sb) {
if(split(toupper(ia), sa) && split(toupper(ib), sb)) {
if(sa[2] < sb[2]) return -1;
else if (sa[2] > sb[2]) return 1;
else {
# compare first names
if(sa[1] < sb[1]) return -1;
else if (sa[1] > sb[1]) return 1;
else return 0;
}
}
else return 0;
}
Jetzt können Sie die PROCINFO["sorted_in"]
in den Kommentaren von @zwets erwähnte Array-Sortiermethode verwenden
PROCINFO["sorted_in"] = "mycmp";
for(i in a) print i, a[i];
Etwas zusammensetzen
#!/usr/bin/gawk -f
function mycmp(ia, va, ib, vb, sa, sb) {
if(split(toupper(ia), sa) && split(toupper(ib), sb)) {
if(sa[2] < sb[2]) return -1;
else if (sa[2] > sb[2]) return 1;
else {
# compare first names
if(sa[1] < sb[1]) return -1;
else if (sa[1] > sb[1]) return 1;
else return 0;
}
}
else return 0;
}
{
a[$1" "$2] = $3;
}
END {
PROCINFO["sorted_in"] = "mycmp";
for(i in a) print i, a[i];
}
Testen:
$ ./namesort.awk yourfile
Kobe Bryant 24
Kevin Durant 35
Blake Griffin 32
Lebron James 23
Dikembe Mutumbo 55
In kleineren oder älteren Versionen von awk ist es möglicherweise am besten, die von indizierten Daten zu speichern, Lastname Firstname
stattdessen mit den herkömmlichen zu sortieren asorti
und dann die Felder der Indizes zu teilen und auszutauschen, während Sie das Array durchlaufen, um es zu drucken:
awk '
{a[$2" "$1]=$3}
END {
n=asorti(a,b); for (i=1;i<=n;i++) {split(b[i],s); print s[2], s[1], a[b[i]]}
}' yourfile
x
, und dannPROCINFO["sorted_in"]
auf einen kryptischen Wert setzen. Geben Sie dann das Array aus. Ich würde nicht dorthin gehen.