如何在awk中获取数组的长度?

sof*_*ost 54 awk

这个命令

echo "hello world" | awk '{split($0, array, " ")} END{print length(array) }'
Run Code Online (Sandbox Code Playgroud)

对我不起作用并给出此错误消息

awk:第1行:对数组数组的非法引用

为什么?

she*_*ter 84

拆分数组时,会返回元素数,因此您可以说:

echo "hello world" | awk '{n=split($0, array, " ")} END{print n }'
# ------------------------^^^--------------------------------^^
Run Code Online (Sandbox Code Playgroud)

输出是:

2
Run Code Online (Sandbox Code Playgroud)


0zk*_* PM 37

Ventimiglia先生的功能需要稍微调整才能完成工作(请参阅for语句中的分号):

function alen(a, i) {
    for(i in a);
    return i
}
Run Code Online (Sandbox Code Playgroud)

但不要在所有的情况或时间工作.那是因为awk存储和"看到"数组索引的方式:它们是关联的,不一定是连续的(比如C.)所以,i不会返回"last"元素.

要解决它,您需要计算:

function alen(a, i, k) {
    k = 0
    for(i in a) k++
    return k
}
Run Code Online (Sandbox Code Playgroud)

并且,以这种方式,注意其他索引类型的"一维"数组,其中索引可能是一个字符串.请参阅:http://docstore.mik.ua/orelly/unix/sedawk/ch08_04.htm.对于"多维"和任意数组,请参阅http://www.gnu.org/software/gawk/manual/html_node/Walking-Arrays.html#Walking-Arrays.


Dav*_*lia 22

我不认为这个人在问,"如何拆分字符串并得到结果数组的长度?" 我认为他们提供的命令只是它出现的情况的一个例子.特别是,我认为这个人在问1)为什么会__CODE__引发错误,2)如何在awk中获取数组的长度?

第一个问题的答案是长度函数不能在POSIX标准awk中的数组上运行,尽管它在GNU awk(gawk)和其他一些变体中都有.第二个问题的答案是(如果我们想要一个适用于awk的所有变体的解决方案)进行线性扫描.

例如,像这样的函数

function alen (a,     i) {
    for (i in a);
    return i;}
Run Code Online (Sandbox Code Playgroud)

注意:第二个参数__CODE__需要一些解释.

在awk中引入局部变量的方式是作为额外的函数参数,约定是通过在这些参数之前添加额外的空格来指示这一点.这在GNU Awk手册中讨论 .

  • 但是所有这一切都是返回数组的第一个索引吗?另外,POSIX并未指定数组迭代的顺序。 (3认同)
  • 好点.我的目的是使用OP的条款回答原始问题,即.`awk'{split($ 0,array,"")} ...'`,因此我的答案取自原来的'The Awk Programming Language'中使用`split`.祝你们好运. (2认同)

Jua*_*doy 16

只想指出:

  • 不需要存储split函数的结果以便打印它.
  • 如果未为拆分提供分隔符,则将使用默认FS(空格).
  • END部分在这里没用.

    echo 'hello world' | awk '{print split($0, a)}'
    
    Run Code Online (Sandbox Code Playgroud)


fed*_*qui 11

gawk你可以使用的功能length():

$ gawk 'BEGIN{a[1]=1; a[2]=2; a[23]=45; print length(a)}'
3

$ gawk 'BEGIN{a[1]=1; a[2]=2; print length(a); a[23]=45; print length(a)}'
2
3
Run Code Online (Sandbox Code Playgroud)

来自GNU Awk用户指南:

使用gawk和其他几个awk实现,当给定数组参数时,该length()函数返回数组中的元素数.(ce)这没有最初看起来那么有用,因为不保证数组从一个索引到其中的元素数.如果在命令行上提供了--lint(请参阅选项),gawk会警告传递数组参数不可移植.如果提供了--posix,则使用数组参数是致命错误(请参阅数组).