3

gawkのasorti関数で次の問題が発生しました。

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

  } \

}'

結果は次のとおりです。

1 1

2 123

3 2

4 21

5 3

したがって、awk、辞書式順序で並べ替えられたインデックスはかなり明確ですが、awkのドキュメントには(asort(s [、d]))と書かれています。

「sの内容は、値を比較するためのgawkの通常のルールを使用してソートされます...」

ただし、インデックス自体を一時配列にコピーし、asort()を使用してその新しい配列を並べ替えると、

それは大丈夫のようです(のようなものを使用して):

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

私はDOIN-IT-WRONGですか、それともgawkのasorti()に問題がありますか?

4

3 に答える 3

3

gawkのマニュアルによると、「覚えておくべき配列に関する重要な側面は、配列の添え字は常に文字列であるということです。

于 2010-06-21T18:25:55.900 に答える
3

gawk 3には制限があったことは知っていますが、gawk 4(少なくとも4.1.1)では簡単です。

t=asorti(a, o, "@ind_num_asc");
于 2015-04-25T00:13:01.877 に答える
1

回避策として、次のようなものを使用できます(パディングを調整する必要がある場合があります)。

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

Gnu awkを使用すると、元のキー/インデックスを保持することもできます。

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]
    }'
于 2010-06-22T09:16:08.903 に答える