sorting arrays awk associative

sorting - Ordenar una matriz asociativa en awk



arrays associative (5)

Esto se toma directamente de la documentación :

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 }

Tengo una matriz asociativa en awk que se llena de esta manera:

chr_count[$3]++

Cuando trato de imprimir mis chr_counts , uso esto:

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

Pero no es sorprendente que el orden de i no esté ordenado de ninguna manera. ¿Hay una manera fácil de iterar sobre las claves ordenadas de chr_count ?


Hace poco me encontré con este problema y encontré que con gawk podía establecer el valor de PROCINFO["sorted_in"] para controlar el orden de iteración. Encontré una lista de valores válidos para esto al buscar PROCINFO en línea y aterrizó en esta página de la Guía del usuario de GNU Awk: https://www.gnu.org/software/gawk/manual/html_node/Controlling-Scanning.html

Esto lista las opciones de la forma @{ind|val}_{num|type|str}_{asc|desc} con:

  • ind por clave (índice) y clasificación val por valor.
  • ordenación numérica numérica, str por cadena y type por tipo asignado.
  • asc para orden ascendente y desc para orden descendente.

Simplemente utilicé

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

Y la salida se ordenó en orden descendente de valores.


Tenga en cuenta que asort() y asorti() son específicos de gawk, y son desconocidos para awk. Para awk simple, puedes tirar tu propio sort() o obtener uno de otro lugar.


puede utilizar el comando ordenar. p.ej

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


En lugar de asort , use asorti(source, destination) que ordena los índices en una nueva matriz y no tendrá que copiar la matriz.

Luego puede usar la matriz de destino como punteros en la matriz de origen.

Para tu ejemplo, lo usarías así:

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