Embora eu não o recomende (dada a relativa simplicidade de canalizar o resultado através de um sort
comando externo ), você pode fazer isso pelo menos com versões recentes do GNU awk (pelo menos 4.0 IIRC), conforme descrito em Classificando valores e índices de matrizes com gawk
Veja como você pode implementá-lo, supondo que você tenha os dados em uma matriz associativa na qual o índice está Firstname Lastname
. Primeiro, você precisa definir uma função de comparação personalizada que divida o índice e depois comparar primeiro Lastname
(como desempate) emFirstname
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 PROCINFO["sorted_in"]
método de classificação de matriz mencionado nos comentários por @zwets
PROCINFO["sorted_in"] = "mycmp";
for(i in a) print i, a[i];
Juntar as peças
#!/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];
}
Teste:
$ ./namesort.awk yourfile
Kobe Bryant 24
Kevin Durant 35
Blake Griffin 32
Lebron James 23
Dikembe Mutumbo 55
Nas versões menor ou mais antiga do awk, sua melhor aposta pode ser armazenar os dados indexados Lastname Firstname
, classificar com o convencional asorti
, dividir e trocar os campos dos índices à medida que você percorre a matriz para imprimi-la:
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
e definirPROCINFO["sorted_in"]
um valor criptográfico, em seguida, imprima a matriz. Eu não iria lá.