Domanda

c'ho seguente problema con la funzione Asorti di 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]; \

  } \

}'

Il risultato è:

1 1

2 123

3 2

4 21

5 3

Quindi è awk abbastanza chiaro, indici in ordine lessicografico allineati, ma doc awk dice (asort (s [, d])):

  

"Il contenuto di s sono ordinati usando le normali regole di gawk per i valori di confronto ..."

Tuttavia, quando si copiano indici in matrice temperatura, e ordinare quel nuovo array utilizzando asort (),

sembra ok (utilizzando qualcosa di simile):

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

I Am DOIN-IT-SBAGLIATO, o è problema con Asorti di gawk ()?

È stato utile?

Soluzione

Secondo il gawk manuale : " un aspetto importante sugli array da ricordare è che indici di matrice sono sempre stringhe. "

Altri suggerimenti

So che sono stati posti limiti gawk 3, ma su gawk 4 (almeno su 4.1.1) è banale:

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

Come soluzione alternativa si potrebbe usare qualcosa di simile (potrebbe essere necessario regolare l'imbottitura):

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 si può anche conservare le originali chiavi / indici:

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]
    }'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top