【问题标题】:awk: function asorti never definedawk:函数 asorti 从未定义
【发布时间】:2016-09-10 13:25:31
【问题描述】:

我正在编写 awk 程序,程序需要对“关联数组”进行排序

{
    subj[$1]++  
}
END{

    n=asorti(subj, sorted)
    for(k=1;k<=n;k++)
    {
        print(k" "sorted[k])
    }
}

使用下面的 cmd 执行时

$ awk -f prg.awk "subjects"

给出以下错误:

awk: 函数 asorti 从未定义

[输入文件]

Phy
Math
Math
Science
Bio
Phy

操作系统:ubuntu 16.04

异常的o/p

Bio 1
Math 2
Phy 2
Science 1

【问题讨论】:

  • 你使用的是哪个 awk?
  • @JamesBrown Awk 4.1.3
  • 不要使用print(foo" "bar)print 是 awk 中的运算符,而不是函数。不需要括号。你可以给它多个用逗号分隔的参数。它们的值以OFS(输出字段分隔符)在它们之间打印,默认情况下是一个空格,最后是ORS(输出记录分隔符),默认情况下是换行符。所以,print k, sorted[k] 是惯用的。

标签: bash awk ubuntu-16.04


【解决方案1】:

在 Gnu awk 中,您可以使用 PROCINFO["sorted_in"] 设置 for 扫描顺序:

$ cat > foo.awk
{
    a[$1]++
} 
END {
    PROCINFO["sorted_in"]="@ind_str_asc"  # scanning in index ascending order
    for(i in a)                           # for here uses above defined order
        print i,a[i]
}
Bio 1
Math 2
Phy 2
Science 1

https://www.gnu.org/software/gawk/manual/html_node/Controlling-Scanning.html

【讨论】:

  • 谢谢。是的,试过了。它来了。但是我怎样才能实现我给定的 o/p。主题频率未出现。
  • 这可能是因为您的代码仍然引用了不存在的sorted 数组。该数组应该由asorti 生成。
  • @SeeTheC 如果您正在运行的 awk 没有 asorti() 那么它不是 GNU awk ,因此肯定没有 PROCINFO["sorted_in"] 所以如果您按照预期的顺序获得输出,这个输入集的哈希顺序与您想要的顺序相匹配,这纯粹是巧合,而您实际上并没有解决您的问题,即您运行的告诉您 asorti() 未定义的 awk 不是 GNU awk,您所做的只是隐藏问题(因为填充名为 PROCINFO 的未使用数组不会产生错误消息)。
  • 投反对票时通常会发表评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 2014-10-01
  • 2014-06-19
相关资源
最近更新 更多