这是我的数组(gawk 脚本):
myArray["peter"] = 32
myArray["bob"] = 5
myArray["john"] = 463
myArray["jack"] = 11
排序后,我需要以下结果:
bob 5
jack 11
peter 32
john 463
当我使用“asort”时,索引会丢失。如何在不丢失索引的情况下按数组值排序?(我需要根据它们的值排序索引)
(我只需要使用 awk/gawk 来获得这个结果,而不是 shell 脚本、perl 等)
如果我的帖子不够清楚,这里有另一篇解释相同问题的帖子:http ://www.experts-exchange.com/Programming/Languages/Scripting/Shell/Q_26626841.html )
提前致谢
更新 :
感谢你们俩,但我需要按值排序,而不是索引(我想要根据它们的值排序索引)。
换句话说,我需要这个结果:
bob 5
jack 11
peter 32
john 463
不是 :
bob 5
jack 11
john 463
peter 32
(我同意,我的例子很混乱,选择的值很糟糕)
从 Catcall 的代码中,我编写了一个有效的快速实现,但它相当难看(我在排序之前连接键和值,并在比较期间拆分)。这是它的样子:
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")
}
当然,如果您有更干净的东西,我很感兴趣...
谢谢你的时间