这个命令
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手册中讨论 .
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,则使用数组参数是致命错误(请参阅数组).