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

lon*_*r21 20 arrays sorting awk associative

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

chr_count[$3]++
Run Code Online (Sandbox Code Playgroud)

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

for (i in chr_count) {
    print i,":",chr_count[i];
}
Run Code Online (Sandbox Code Playgroud)

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

Pau*_*ce. 28

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

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

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

n=asorti(chr_count, sorted)
for (i=1; i<=n; i++) {
        print sorted[i] " : " chr_count[sorted[i]]
}
Run Code Online (Sandbox Code Playgroud)

  • `asorti` 不适用于 nawk-20121220-2.fc20.x86_64。 (2认同)
  • GNU Awk 的 [文档](https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html) 确实提到:“asort() 和 asorti() 是 gawk 扩展;它们不可用在兼容模式下(请参阅[选项](https://www.gnu.org/software/gawk/manual/html_node/Options.html))”。 (2认同)

小智 12

你可以使用sort命令.例如

for ( i in data )
 print i ":", data[i]  | "sort"
Run Code Online (Sandbox Code Playgroud)


mr.*_*xit 8

请注意,asort()并且asorti()特定于gawk,并且awk不知道.对于普通的awk,您可以自己滚动sort()或从其他地方获取.


Joe*_*e F 8

我最近遇到了这个问题,发现使用 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]
Run Code Online (Sandbox Code Playgroud)

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


Cas*_*bel 5

这是直接取自文档

 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
 }
Run Code Online (Sandbox Code Playgroud)

  • @haridsv 不,我不这么认为。这个问题是关于按键排序,而不是按值排序,并且同一个键不能有两个值,所以这里没有问题。您指出的另一个问题是关于按值排序(实际上可能并不都是不同的),因此如果您尝试使用此代码来实现此目的,这将是一个问题。但如果你按照它所写的目的使用它,这并没有缺陷。 (2认同)