我在awk中有一个关联数组,其填充方式如下:
chr_count[$3]++
当我尝试打印我的chr_counts
时,我使用了这个:
for (i in chr_count) {
print i,":",chr_count[i];
}
但毫不奇怪,i的顺序没有以任何方式排序。
是否有一种简单的方法来迭代chr_count
的排序键?
答案 0 :(得分:28)
使用asorti(source, destination)
代替asort ,将索引排序到新数组中,您不必复制数组。
然后您可以使用目标数组作为源数组的指针。
对于您的示例,您可以像这样使用它:
n=asorti(chr_count, sorted)
for (i=1; i<=n; i++) {
print sorted[i] " : " chr_count[sorted[i]]
}
答案 1 :(得分:11)
您可以使用sort命令。 e.g。
for ( i in data )
print i ":", data[i] | "sort"
答案 2 :(得分:8)
请注意asort()
和asorti()
特定于gawk,并且awk不知道。对于普通awk,您可以自己滚动sort()
或从其他地方获取。
答案 3 :(得分:4)
直接来自the documentation:
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
}
答案 4 :(得分:1)
我最近遇到过这个问题并发现使用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]
输出按值的降序排序。