Bien que je ne le recommanderais pas (étant donné la relative simplicité de la transmission du résultat via une sort
commande externe ), vous pouvez le faire au moins avec les versions récentes de GNU awk (au moins 4.0 IIRC), comme décrit dans Trier les valeurs et les indices de tableau avec gawk
Voici comment vous pouvez l'implémenter, en supposant que vous avez les données dans un tableau associatif dans lequel se trouve l'index Firstname Lastname
. Vous devez d'abord définir une fonction de comparaison personnalisée qui divise l'index, compare d'abord Lastname
puis (comme un bris d'égalité) sur Firstname
par exemple
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;
}
Vous pouvez maintenant utiliser la PROCINFO["sorted_in"]
méthode de tri des tableaux mentionnée dans les commentaires de @zwets
PROCINFO["sorted_in"] = "mycmp";
for(i in a) print i, a[i];
Mettre ensemble
#!/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];
}
Essai:
$ ./namesort.awk yourfile
Kobe Bryant 24
Kevin Durant 35
Blake Griffin 32
Lebron James 23
Dikembe Mutumbo 55
Dans les versions antérieures ou inférieures de awk, votre meilleur pari peut être de stocker les données indexées à la Lastname Firstname
place, de les trier avec le conventionnel asorti
, puis de diviser et d'échanger les champs des index lorsque vous parcourez le tableau pour l'imprimer:
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
, puis définirPROCINFO["sorted_in"]
une valeur cryptique, puis sortez le tableau. Je n'irais pas là-bas.