Aunque no lo recomendaría (dada la relativa simplicidad de canalizar el resultado a través de un sortcomando externo ), puede hacerlo al menos con versiones recientes de GNU awk (al menos 4.0 IIRC), como se describe en Clasificación de valores e índices de matriz con gawk
A continuación, le mostramos cómo podría implementarlo, suponiendo que tenga los datos en una matriz asociativa en la que se encuentra el índice Firstname Lastname. Primero, debe definir una función de comparación personalizada que divida el índice, primero compare Lastnameluego (como un desempate) en, Firstnamep. Ej.
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;
}
Ahora puede usar el PROCINFO["sorted_in"]método de clasificación de matriz mencionado en los comentarios de @zwets
PROCINFO["sorted_in"] = "mycmp";
for(i in a) print i, a[i];
Poniendo todo junto
#!/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];
}
Pruebas:
$ ./namesort.awk yourfile
Kobe Bryant 24
Kevin Durant 35
Blake Griffin 32
Lebron James 23
Dikembe Mutumbo 55
En versiones menores o anteriores de awk, su mejor opción puede ser almacenar los datos indexados Lastname Firstname, ordenarlos con los convencionales asorti, luego dividir e intercambiar los campos de los índices a medida que recorre la matriz para imprimirla:
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
xy luego establecerlasPROCINFO["sorted_in"]en un valor críptico, luego genera la matriz. Yo no iría allí