我在 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)
,它将对索引排序并生成一个新数组,你不需要复制原始数组。
然后你可以使用目标数组作为源数组的指针。
对于你的示例,你可以像这样使用它:
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"
我最近遇到了这个问题,发现使用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]
输出结果按值的降序排序。
gawk
- PROCINFO
对于 awk
本身并不是特殊的东西。 - Eugene Pakhomovasort()
和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
}
PROCINFO["sorted_in"] = "@val_num_asc"
等非常简单。手册展示了许多不同的选项,如果您想要按值/键、数字/字符串、自定义函数等进行降序/升序排序:https://www.gnu.org/software/gawk/manual/html_node/Controlling-Scanning - unhammer