awk中删除数组

awk中删除数组

在awk中,我可以用循环清除一个数组,使其成为一个空数组,相当于删除它。

for (key in array) delete array[key];

有没有更简单的方法?我可以完全删除一个数组,以便变量名可以重新用于标量吗?

答案1

语法

delete array

POSIX 的当前版本中不支持它,但几乎所有现有的实现(包括原始的 awk、GNU、mawk 和 BusyBox)都支持它。它将被添加到 POSIX 的未来版本中(请参阅缺陷0000544)。

清除所有数组元素的另一种方法是依靠split删除所有现有元素,该方法既可移植又符合标准,并且是表达式而不是语句:

split("", array)

所有这些,包括delete array,都将变量标记为原始 awk、GNU awk 和 mawk 中的数组变量(但不在 BusyBox awk 中)。据我所知,一旦变量被用作数组,就无法将其用作标量变量。

答案2

不知道为什么这是一个好主意,但如果您想使用与数组和标量相同的名称,如果您不在同一范围内使用它们,则可以这样做,例如:

$ cat tst.awk
BEGIN {
    fooIsArray()
    foo = 17
    print "foo is a scalar:", foo
}

function fooIsArray(    foo) {
    foo[1] = "bar"
    print "foo is an array:", foo[1]
}

$ awk -f tst.awk
foo is an array: bar
foo is a scalar: 17

在上面,我们foo[]通过将函数声明为函数的未使用参数来创建函数局部变量fooIsArray(),因此它与脚本中其他地方使用的全局标量变量无关foo,并且数组的内容foo[]将在从函数返回时被删除fooIsArray()

相关内容