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

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

chr_count[$3]++

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

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

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

Ответы

Ответ 1

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

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

В качестве примера вы можете использовать его следующим образом:

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

 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
 }