Сортировка ассоциативного массива в awk

у меня есть ассоциативный массив в awk, которая заполняется следующим образом:

chr_count[]++

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

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

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

5 ответов


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

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

для вашего примера вы бы использовали его следующим образом:

n=asorti(chr_count, sorted)
for (i=1; i<=n; i++) {
        print sorted[i] " : " chr_count[sorted[i]]
}

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

for ( i in data )
 print i ":", data[i]  | "sort"

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


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

 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
 }

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

в этом списке перечислены параметры формы @{key|val}_{num|type|str}_{asc|desc} С:

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

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

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

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