Сортировка ассоциативного массива в 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]
и вывод был отсортирован в порядке убывания значений.