是否可以在awk中将项附加到数组而不指定索引?

mer*_*011 19 awk gawk

我意识到awk有关联数组,但我想知道是否有一个等同于此的awk:

http://php.net/manual/en/function.array-push.php

明显的解决方法是说:

array[$new_element] = $new_element
Run Code Online (Sandbox Code Playgroud)

然而,这似乎不那么可读,而且比它需要的更加黑客.

Mar*_*ins 12

我不认为在awk中可以立即获得数组长度(至少在我不知道的版本中).但你可以简单地保持长度,然后做这样的事情:

array[arraylen++] = $0;
Run Code Online (Sandbox Code Playgroud)

然后通过相同的整数值访问它的元素:

for ( i = 0; i < arraylen; i++ )
   print array[i];
Run Code Online (Sandbox Code Playgroud)

  • +1 - GAWK 中的“length()”函数将返回数组中的元素数量,但由于数组是稀疏的,因此长度不一定是最后一个元素。 (3认同)
  • 仅供历史参考,"长度(arrayname)"符号并非GAWK独有.它是[添加](https://github.com/onetrueawk/awk/blob/master/FIXES#L322)到2002年的One True Awk.可能是这个功能击中gawk [三年后](http: //code.metager.de/source/xref/gnu/gawk/ChangeLog.0#3453). (2认同)

tri*_*eee 9

gawk你可以找到一个数组的长度,length(var)因此烹饪你自己的功能并不是很难.

function push(A,B) { A[length(A)+1] = B }
Run Code Online (Sandbox Code Playgroud)

请注意这个讨论:http://objectmix.com/awk/361598-gawk-length-array-question.html - 我现在可以访问的所有地方都有gawk 3.1.5所以我无法正确测试我的功能,咄.但这是一个近似值.

vnix$ gawk '# BEGIN: make sure arr is an array
>   BEGIN { delete arr[0] }
>   { print "=" length(arr); arr[length(arr)+1] = $1;
>     print length(arr), arr[length(arr)] }
>   END { print "---";
>     for (i=1; i<=length(arr); ++i) print i, arr[i] }' <<HERE
> fnord foo
> ick bar
> baz quux
> HERE
=0
1 fnord
=1
2 ick
=2
3 baz
---
1 fnord
2 ick
3 baz
Run Code Online (Sandbox Code Playgroud)

  • 不能保证`A [length(A)+1]`片段避免冲突.它适用于像您的示例一样的情况,您只能以可预测的顺序向数组添加内容.但是,如果您要删除数组元素,则会创建间隙,这会减少`length()`,同时保留最高数字. (2认同)