如何在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