awk / gawk problème Asorti ()
-
28-09-2019 - |
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 ()?
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]
}'