Voici mon tableau (gawk script) :
myArray["peter"] = 32
myArray["bob"] = 5
myArray["john"] = 463
myArray["jack"] = 11
Après le tri, j'ai besoin du résultat suivant :
bob 5
jack 11
peter 32
john 463
Lorsque j'utilise "asort", les indices sont perdus. Comment trier par valeur de tableau sans perdre les indices ? (J'ai besoin d'indices ordonnés en fonction de leurs valeurs).
(J'ai besoin d'obtenir ce résultat avec awk/gawk seulement, pas avec le shell script, perl, etc)
Si mon message n'est pas assez clair, voici un autre message expliquant le même problème : http://www.experts-exchange.com/Programming/Languages/Scripting/Shell/Q_26626841.html )
Merci d'avance
Mise à jour :
Merci à vous deux, mais j'ai besoin de trier par valeurs, pas par indices (je veux des indices ordonnés selon leurs valeurs).
En d'autres termes, j'ai besoin de ce résultat :
bob 5
jack 11
peter 32
john 463
pas :
bob 5
jack 11
john 463
peter 32
(je suis d'accord, mon exemple est confus, les valeurs choisies sont plutôt mauvaises)
A partir du code de Catcall, j'ai écrit une implémentation rapide qui fonctionne, mais qui est plutôt moche (je concatène les clés et les valeurs avant le tri et je les sépare pendant la comparaison). Voici à quoi ça ressemble :
function qsort(A, left, right, i, last) {
if (left >= right)
return
swap(A, left, left+int((right-left+1)*rand()))
last = left
for (i = left+1; i <= right; i++)
if (getPart(A[i], "value") < getPart(A[left], "value"))
swap(A, ++last, i)
swap(A, left, last)
qsort(A, left, last-1)
qsort(A, last+1, right)
}
function swap(A, i, j, t) {
t = A[i]; A[i] = A[j]; A[j] = t
}
function getPart(str, part) {
if (part == "key")
return substr(str, 1, index(str, "#")-1)
if (part == "value")
return substr(str, index(str, "#")+1, length(str))+0
return
}
BEGIN { }
{ }
END {
myArray["peter"] = 32
myArray["bob"] = 5
myArray["john"] = 463
myArray["jack"] = 11
for (key in myArray)
sortvalues[j++] = key "#" myArray[key]
qsort(sortvalues, 0, length(myArray));
for (i = 1; i <= length(myArray); i++)
print getPart(sortvalues[i], "key"), getPart(sortvalues[i], "value")
}
Bien sûr, je suis intéressé si vous avez quelque chose de plus propre...
Merci pour votre temps