ここに私の配列(gawkスクリプト)があります:
myArray["peter"] = 32
myArray["bob"] = 5
myArray["john"] = 463
myArray["jack"] = 11
ソート後、次の結果が必要です。
bob 5
jack 11
peter 32
john 463
「asort」を使用すると、インデックスが失われます。インデックスを失うことなく配列値でソートする方法は? (値に基づいて順序付けられたインデックスが必要です)
(シェルスクリプトやperlなどではなく、awk/gawkのみでこの結果を取得する必要があります)
私の投稿が十分に明確でない場合は、同じ問題を説明する別の投稿があります: 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")
}
もちろん、もっときれいなものがあれば興味があります...
御時間ありがとうございます