在awk中对关联数组进行排序

时间:2010-03-16 21:37:13

标签: sorting arrays awk associative

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

chr_count[$3]++

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

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

但毫不奇怪,i的顺序没有以任何方式排序。 是否有一种简单的方法来迭代chr_count的排序键?

5 个答案:

答案 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]

输出按值的降序排序。