我在 awk 中有一个关联数组,填充如下:
chr_count[$3]++
当我尝试打印我的chr_counts
时,我使用这个:
for (i in chr_count) {
print i,":",chr_count[i];
}
但毫不奇怪, i 的顺序没有以任何方式排序。有没有一种简单的方法来遍历排序的键chr_count
?
我在 awk 中有一个关联数组,填充如下:
chr_count[$3]++
当我尝试打印我的chr_counts
时,我使用这个:
for (i in chr_count) {
print i,":",chr_count[i];
}
但毫不奇怪, i 的顺序没有以任何方式排序。有没有一种简单的方法来遍历排序的键chr_count
?
而不是 asort,使用asorti(source, destination)
which 将索引排序到一个新数组中,您不必复制数组。
然后,您可以使用目标数组作为指向源数组的指针。
对于您的示例,您可以像这样使用它:
n=asorti(chr_count, sorted)
for (i=1; i<=n; i++) {
print sorted[i] " : " chr_count[sorted[i]]
}
您可以使用排序命令。例如
for ( i in data )
print i ":", data[i] | "sort"
我最近遇到了这个问题,发现使用 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]
并且输出按值的降序排序。
请注意,asort()
andasorti()
是 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
}