2010-06-21 19 views
2

J'ai le problème suivant Asorti() avec la fonction Asorti de gawk:awk/gawk problème

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 awk assez clair, les indices classés dans l'ordre lexicographique , mais dit le doc de awk (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 elle-même des indices dans un tableau de température, et sorte que le 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-WRONG, ou est-ce un problème avec asorti() de gawk?

+0

Votre script awk est entre guillemets simples, de sorte que vous n'avez pas besoin antislashs. –

Répondre

3

Selon le gawk manual: « Un aspect important sur les tableaux à retenir est que indices de tableau sont toujours des chaînes. »

+0

MERCI! J'ai raté ça. – GiM

0

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

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"); 
+0

astuce utile, merci! – GiM

+0

Vous avez sauvé toute ma vie! n'a pas remarqué le 3ème argument dans asorti. Merci. –