这个命令
echo "hello world" | awk '{split($0, array, " ")} END{print length(array) }'
对我不起作用,并显示此错误消息
awk:第1行:对数组array的非法引用
为什么?
Answers:
拆分数组时,将返回元素数,因此您可以说:
echo "hello world" | awk '{n=split($0, array, " ")} END{print n }'
# ------------------------^^^--------------------------------^^
输出为:
2
c
语言0
,或者一些非零值作为有用信息返回。祝好运!
文蒂米利亚先生的职能需要稍作调整才能完成这项工作(有关说明,请参见分号):
function alen(a, i) {
for(i in a);
return i
}
但是,不要在所有情况下都工作。这是因为awk存储和“查看”数组索引的方式:它们是关联的,不一定是连续的(如C。)因此,i
不返回“ last”元素。
要解决此问题,您需要计算:
function alen(a, i, k) {
k = 0
for(i in a) k++
return k
}
并且,以这种方式,请注意“一维”数组的其他索引类型,其中索引可能是字符串。请参阅:http : //docstore.mik.ua/orelly/unix/sedawk/ch08_04.htm。有关“多维”数组和任意数组,请参见http://www.gnu.org/software/gawk/manual/html_node/Walking-Arrays.html#Walking-Arrays。
我不认为这个人在问,“如何分割字符串并获取结果数组的长度?” 我认为他们提供的命令只是发生这种情况的一个例子。特别是,我认为这个人在问:1)为什么length(array)会引发错误,以及2)如何获取awk中数组的长度?
第一个问题的答案是,尽管在GNU awk(gawk)和其他一些变体中,长度函数对POSIX标准awk中的数组不起作用。第二个问题的答案是(如果我们想要一个适用于awk所有变体的解决方案)进行线性扫描。
例如,如下函数:
function alen (a, i) {
for (i in a);
return i;}
注意:第二个参数我值得解释。
在awk中引入局部变量的方式是作为额外的函数参数,惯例是通过在这些参数之前添加额外的空格来表明这一点。这是在GNU awk中手动讨论在这里。
awk '{split($0, array, " ")}...'
,因此也是我的答案,取材自split
原始的“ Awk编程语言”。祝你们好运。
... { for(i in a) c++; return c }
只想指出:
split
函数的结果即可打印。FS
(空白)。该END
部分在这里没有用。
echo 'hello world' | awk '{print split($0, a)}'
在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
使用gawk和其他几个awk实现,给定数组参数时,该
length()
函数将返回array中元素的数量。(ce)这比起初看起来没有用,因为不能保证将数组从一个索引到其中的元素数。如果在命令行上提供了--lint(请参阅选项),则gawk警告传递数组参数是不可移植的。如果提供了--posix,则使用数组参数是一个致命错误(请参阅数组)。
如果不使用gawk,请尝试此操作。
awk 'BEGIN{test="aaa bbb ccc";a=split(test, ff, " "); print ff[1]; print a; print ff[a]}'
输出:
aaa
3
ccc
8.4.4使用split()创建数组http://docstore.mik.ua/orelly/unix/sedawk/ch08_04.htm