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 ()?

¿Fue útil?

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]
    }'
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top