Вот мой массив (скрипт gawk):
myArray["peter"] = 32
myArray["bob"] = 5
myArray["john"] = 463
myArray["jack"] = 11
После сортировки мне нужен следующий результат:
bob 5
jack 11
peter 32
john 463
Когда я использую "asort", индексы теряются. Как отсортировать по значению массива без потери индексов? (Мне нужны упорядоченные индексы на основе их значений)
(мне нужно получить этот результат только с помощью awk / gawk, а не сценария оболочки, perl и т. Д.)
Если мой пост недостаточно ясен, вот другой пост, объясняющий ту же проблему: http://www.experts -exchange.com / Программирование / Языки / Сценарии / 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")
}
Конечно, мне интересно, есть ли у вас что-нибудь более чистое ...
Спасибо за ваше время