Embora eu não recomende (dada a relativa simplicidade de canalizar o resultado através de um comando externo sort
) você pode fazer isso pelo menos com versões recentes do GNU awk (pelo menos 4.0 IIRC), como descrito em < a href="https://www.gnu.org/software/gawk/manual/html_node/Array-Sorting-Functions.html#Array-Sorting-Functions"> Classificando os valores e índices da matriz com gawk
Veja como você pode implementá-lo, supondo que você tenha os dados em uma matriz associativa em que o índice é Firstname Lastname
. Primeiro, você precisa definir uma função de comparação personalizada que divida o índice e compare primeiro com Lastname
(como desempatador) em Firstname
, por exemplo,
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;
}
Agora você pode usar o método de classificação PROCINFO["sorted_in"]
array mencionado nos comentários por @zwets
PROCINFO["sorted_in"] = "mycmp";
for(i in a) print i, a[i];
Colocando tudo 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[" "] = ;
}
END {
PROCINFO["sorted_in"] = "mycmp";
for(i in a) print i, a[i];
}
Teste:
$ ./namesort.awk yourfile
Kobe Bryant 24
Kevin Durant 35
Blake Griffin 32
Lebron James 23
Dikembe Mutumbo 55
Em versões menores ou mais antigas do awk, sua melhor aposta pode ser armazenar os dados indexados por Lastname Firstname
, classificar com o asorti
convencional, depois dividir e trocar os campos dos índices conforme você percorre o array para imprima:
awk '
{a[" "]=}
END {
n=asorti(a,b); for (i=1;i<=n;i++) {split(b[i],s); print s[2], s[1], a[b[i]]}
}' yourfile