Сортировка ассоциативного массива с помощью AWK

Вот мой массив (сценарий 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/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")
}

Конечно, мне интересно, есть ли у вас что-нибудь более чистое ...

Спасибо за ваше время

14
задан Phil 17 March 2011 в 21:35
поделиться