Aunque no lo recomendaría (dada la relativa simplicidad de canalizar el resultado a través de un sort
comando 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 Lastname
luego (como un desempate) en, Firstname
p. 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
x
y luego establecerlasPROCINFO["sorted_in"]
en un valor críptico, luego genera la matriz. Yo no iría allí