awk / gawk asorti()問題
-
28-09-2019 - |
質問
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ですが、awkのドキュメントは(asort(s [、d]))と言います。
「Sの内容は、値を比較するためにGawkの通常のルールを使用してソートされます...」
ただし、インデックスをTEMPアレイにコピーし、ASORT()を使用してその新しい配列を並べ替えた場合
それは大丈夫のようです(ようなものを使用して):
j=1; for(e in a) { temp[j++] = e; }
私はdoin-it-rongですか、それともGawkのAsorti()に問題がありますか?
解決
による ゴークマニュアル: :「覚えておくべきアレイについての重要な側面は、 配列のサブスクリプトは常に文字列です。"
他のヒント
t=asorti(a, o, "@ind_num_asc");
回避策として、このようなものを使用できます(パディングを調整する必要がある場合があります):
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]
}'
所属していません StackOverflow