25

我在 awk 中有一个关联数组,填充如下:

chr_count[$3]++

当我尝试打印我的chr_counts时,我使用这个:

for (i in chr_count) {
    print i,":",chr_count[i];
}

但毫不奇怪, i 的顺序没有以任何方式排序。有没有一种简单的方法来遍历排序的键chr_count

4

5 回答 5

33

而不是 asort,使用asorti(source, destination)which 将索引排序到一个新数组中,您不必复制数组。

然后,您可以使用目标数组作为指向源数组的指针。

对于您的示例,您可以像这样使用它:

n=asorti(chr_count, sorted)
for (i=1; i<=n; i++) {
        print sorted[i] " : " chr_count[sorted[i]]
}
于 2010-03-16T21:56:33.750 回答
13

您可以使用排序命令。例如

for ( i in data )
 print i ":", data[i]  | "sort"
于 2013-12-23T08:14:12.497 回答
11

我最近遇到了这个问题,发现使用 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]

并且输出按值的降序排序。

于 2018-02-23T10:56:27.523 回答
9

请注意,asort()andasorti()是 gawk 特有的,awk 不知道。对于普通的 awk,您可以自己滚动sort()或从其他地方获取。

于 2012-12-18T14:28:44.780 回答
6

这直接取自文档

 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
 }
于 2010-03-16T21:47:35.657 回答