awk / gawk asorti () problema
-
28-09-2019 - |
Pregunta
Tengo siguiente problema con la función de asorti gawk:
gawk 'BEGIN{ \
a[1]=6; \
a[2]=7; \
a[3]=8; \
a[21]=9; \
a[123]=10; \
t=asorti(a, o); \
for (i=1; i<=t; i++) { \
print i,o[i]; \
} \
}'
El resultado es:
1 1
2 123
3 2
4 21
5 3
Así que es bastante claro awk, ordenadas según los índices en orden lexicográfico, pero doc de awk dice (ASORT (s [, d])):
"El contenido de s se clasifican utilizando las reglas normales de gawk para comparar valores ..."
Sin embargo, cuando copio índices de sí mismo en una matriz temp, y ordenar que la nueva matriz mediante asort (),
parece bien (usando algo como):
j=1; for(e in a) { temp[j++] = e; }
¿Soy DOIN-IT-MAL, o se trata de un problema en esta asorti de gawk ()?
Solución
De acuerdo con la gawk manual de : " un aspecto importante acerca de las matrices a tener en cuenta es que subíndices de matriz son siempre cadenas. "
Otros consejos
Sé que hubo limitaciones en gawk 3, pero en gawk 4 (al menos en 4.1.1) es trivial:
t=asorti(a, o, "@ind_num_asc");
Como solución se podría usar algo como esto (es posible que tenga que ajustar el relleno):
gawk 'BEGIN {
a[1] = 6; a[2] = 7; a[3] = 8; a[21] = 9; a[123] = 10;
for (i in a) io[sprintf("%15s", i)] = a[i]
t = asorti(io, o)
for (i = 0; ++i <= t;) print i, o[i] + 0
}'
con GNU awk incluso se puede preservar las llaves originales / índices:
WHINY_USERS=oops gawk 'BEGIN {
a[1]=6; a[2]=7; a[3]=8; a[21]=9; a[123]=10;
for (i in a) o[sprintf("%15s", i)] = a[i]
for (i in o) print i + 0, o[i]
}'