私はawkに次のように入力される連想配列を持っています:
chr_count[$3]++
chr_counts
を印刷しようとすると、次のようになります。
for (i in chr_count) {
print i,":",chr_count[i];
}
しかし、当然のことながら、iの順序はまったくソートされていません。 chr_count
のソートされたキーを反復処理する簡単な方法はありますか?
asortの代わりに、asorti(source, destination)
を使用して、インデックスを新しい配列に並べ替えます。配列をコピーする必要はありません。
次に、宛先配列をソース配列へのポインターとして使用できます。
あなたの例では、次のように使用します。
n=asorti(chr_count, sorted)
for (i=1; i<=n; i++) {
print sorted[i] " : " chr_count[sorted[i]]
}
sortコマンドを使用できます。例えば.
for ( i in data )
print i ":", data[i] | "sort"
asort()
とasorti()
はgawkに固有であり、awkには不明であることに注意してください。プレーンなawkの場合は、独自のsort()
をロールするか、他の場所から取得できます。
これは ドキュメント から直接取得されます:
populate the array data
# copy indices
j = 1
for (i in data) {
ind[j] = i # index value becomes element value
j++
}
n = asort(ind) # index values are now sorted
for (i = 1; i <= n; i++) {
do something with ind[i] Work with sorted indices directly
...
do something with data[ind[i]] Access original array via sorted indices
}
最近この問題に遭遇し、gawkを使用してPROCINFO["sorted_in"]
の値を設定して反復順序を制御できることがわかりました。オンラインでPROCINFOを検索して、これに有効な値のリストを見つけ、これにアクセスしましたGNU Awkユーザーガイドページ: https://www.gnu.org/software/gawk /manual/html_node/Controlling-Scanning.html
これは、@{ind|val}_{num|type|str}_{asc|desc}
の形式のオプションを次のようにリストします。
ind
キー(インデックス)による並べ替えとval
値による並べ替え。num
数値による並べ替え、str
は文字列による並べ替え、type
は割り当てられたタイプによる並べ替え。asc
、降順の場合はdesc
。私は単に使用しました:
PROCINFO["sorted_in"] = "@val_num_desc"
for (i in map) print i, map[i]
そして、出力は値の降順でソートされました。