如何在awk中获取数组的长度?
这个命令
echo "hello world" | awk '{split($0, array, " ")} END{print length(array) }'
不起作用,给我这个错误信息
awk:第1行:对数组数组的非法引用
为什么?
当你拆分一个数组时,元素的数量会被返回,所以你可以说:
echo "hello world" | awk '{n=split($0, array, " ")} END{print n }' # ------------------------^^^--------------------------------^^
输出是:
2
文蒂米利亚先生的职能需要做一点小小的调整(见分号):
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 }
而且,以这种方式,照顾其他索引types的“一维”数组,其中索引可能是一个string。 请参阅: http : //docstore.mik.ua/orelly/unix/sedawk/ch08_04.htm 。 对于“多维”和任意数组,请参见http://www.gnu.org/software/gawk/manual/html_node/Walking-Arrays.html#Walking-Arrays 。
我不认为这个人问:“我如何分割一个string,并得到结果数组的长度? 我认为他们提供的命令只是其中的一个例子。 特别是,我认为这个人在问1)为什么length(array)
会引发一个错误,以及2)如何在awk中获得一个数组的长度?
第一个问题的答案是,长度函数不适用于POSIX标准awk中的数组,尽pipe它在GNU awk(gawk)和其他一些变体中有效。 第二个问题的答案是(如果我们想要一个可以在awk的所有版本中工作的解决scheme)进行线性扫描。
例如,像这样的function
function alen (a, i) { for (i in a) return i }
注 :第二个参数i
保证一些解释。
在awk中引入局部variables的方式是作为额外的函数参数,约定是通过在这些参数之前添加额外的空格来指示这一点。 这在GNU Awk手册中进行了讨论。
只是想指出一点:
- 不需要存储
split
函数的结果来打印它。 - 如果未提供分隔符,则将使用默认
FS
(空格)。 -
END
部分在这里没用 。echo 'hello world' | awk '{print split($0, a)}'
在MacOSX Lion上的样本显示使用的端口(输出可以是192.168.111.130.49704或:: 1.49704):
netstat -a -n -p tcp | awk '/\.[0-9]+ / {n=split($4,a,"."); print a[n]}'
在这个例子中,打印第四列的最后一个数组项目:“49704”
在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
从GNU Awk用户指南 :
用gawk和其他一些awk实现,当给定一个数组参数时,
length()
函数返回数组中元素的个数 。 (ce)由于数组不能保证从一个索引到其中的元素的数量,所以它起初看起来不太有用。 如果在命令行上提供了–lint(请参阅选项),gawk会警告传递数组参数是不可移植的。 如果提供了–posix,则使用数组参数是致命错误(请参阅数组)。
echo "hello world" | awk '{lng=split($0, array, " ")} END{print lng) }'
如果你不使用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()创build数组http://docstore.mik.ua/orelly/unix/sedawk/ch08_04.htm