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ónval
por valor. - ordenación numérica numérica,
str
por cadena ytype
por tipo asignado. -
asc
para orden ascendente ydesc
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]]
}