Question

J'ai le problème suivant avec la fonction Asorti de 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]; \

  } \

}'

Le résultat est:

1 1

2 123

3 2

4 21

5 3

Il est donc assez clair awk, triée des indices dans l'ordre lexicographique, mais le doc awk dit (asort (s [, d])):

  

« Le contenu de s sont classés en utilisant les règles normales de gawk pour comparer les valeurs ... »

Cependant, quand je copie indices se place dans un tableau de température, et trier ce nouveau tableau en utilisant asort (),

il semble ok (en utilisant quelque chose comme):

j=1; for(e in a) { temp[j++] = e; }

Am I Doin-IT-MAL, ou est-ce problème avec Asorti de gawk ()?

Était-ce utile?

La solution

Selon le gawk manuel: " un aspect important sur les tableaux à retenir est que indices de tableau sont toujours des chaînes. "

Autres conseils

Je sais qu'il y avait des limites sur gawk 3, mais sur gawk 4 (au moins 4.1.1) il est trivial:

t=asorti(a, o, "@ind_num_asc");

Pour contourner ce problème vous pouvez utiliser quelque chose comme ça (vous devrez peut-être ajuster le rembourrage):

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
    }'

Avec Gnu awk, vous pouvez même conserver les clés d'origine / index:

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]
    }'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top