Сортировать ассоциативный массив в awk - PullRequest
20 голосов
/ 17 марта 2010

У меня есть ассоциативный массив в awk, который заполняется так:

chr_count[$3]++

Когда я пытаюсь напечатать свой chr_counts, я использую это:

for (i in chr_count) {
    print i,":",chr_count[i];
}

Но неудивительно, что порядок i никак не отсортирован. Есть ли простой способ перебрать отсортированные ключи chr_count?

Ответы [ 5 ]

28 голосов
/ 17 марта 2010

Вместо asort , используйте asorti(source, destination), который сортирует индексы в новый массив, и вам не нужно будет копировать массив.

Затем вы можете использовать целевой массив в качестве указателей на исходный массив.

Для вашего примера вы бы использовали его так:

n=asorti(chr_count, sorted)
for (i=1; i<=n; i++) {
        print sorted[i] " : " chr_count[sorted[i]]
}
11 голосов
/ 23 декабря 2013

вы можете использовать команду сортировки. например,

for ( i in data )
 print i ":", data[i]  | "sort"
8 голосов
/ 18 декабря 2012

Обратите внимание, что asort() и asorti() относятся к gawk и неизвестны для awk. Для простого awk вы можете бросить свой собственный sort() или получить его из другого места.

4 голосов
/ 17 марта 2010

Это взято непосредственно из документации :

 populate the array data
 # copy indices
 j = 1
 for (i in data) {
     ind[j] = i    # index value becomes element value
     j++
 }
 n = asort(ind)    # index values are now sorted
 for (i = 1; i <= n; i++) {
     do something with ind[i]           Work with sorted indices directly
     ...
     do something with data[ind[i]]     Access original array via sorted indices
 }
2 голосов
/ 23 февраля 2018

Недавно я столкнулся с этой проблемой и обнаружил, что с помощью gawk я могу установить значение PROCINFO["sorted_in"] для управления порядком итерации. Я нашел список допустимых значений для этого, выполнив поиск PROCINFO онлайн и попав на страницу руководства пользователя GNU Awk: https://www.gnu.org/software/gawk/manual/html_node/Controlling-Scanning.html

Здесь перечислены параметры формы @{ind|val}_{num|type|str}_{asc|desc} с:

  • ind сортировка по ключу (индексу) и val сортировка по значению.
  • num числовая сортировка, str по строке и type по присвоенному типу.
  • asc для возрастания и desc для убывания.

Я просто использовал:

PROCINFO["sorted_in"] = "@val_num_desc"
for (i in map) print i, map[i]

И выходные данные были отсортированы в порядке убывания значений.

...