Frage

Ich habe folgendes Problem mit gawk des asorti Funktion:

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]; \

  } \

}'

Das Ergebnis ist:

1 1

2 123

3 2

4 21

5 3

So ist es ziemlich klar, awk ist, sortiert Indizes in lexikographische Ordnung, aber awk der doc sagt (asort (s [d])):

  

„Die Inhalte s sind sortiert mit gawk normalen Regeln für den Vergleich von Werten ...“

Allerdings, wenn ich kopiere Indizes selbst in temporären Array und sortiert die neue Array mit asort ()

es scheint ok (mit so etwas wie):

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

Am I JOIN-IT-FALSCH, oder ist es Problem mit gawk der asorti ()?

War es hilfreich?

Lösung

Nach dem gaffen Handbuch : " ein wichtiger Aspekt über Arrays zu erinnern ist, dass Array-Indizes sind immer Strings. "

Andere Tipps

Ich weiß, es gab Einschränkungen auf gawk 3, aber auf gawk 4 (zumindest auf 4.1.1) ist es trivial:

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

Als eine Abhilfe Sie so etwas wie diese verwenden könnte (Sie müssen möglicherweise die Polsterung justieren):

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

Mit Gnu awk Sie können sogar den Original-Schlüssel / Indizes erhalten:

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]
    }'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top