在 awk 中删除一个数组

Gil*_*il' 22 array awk

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

for (key in array) delete array[key];
Run Code Online (Sandbox Code Playgroud)

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

Gil*_*il' 34

语法

delete array
Run Code Online (Sandbox Code Playgroud)

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

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

split("", array, ":")
Run Code Online (Sandbox Code Playgroud)

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

  • 或者只是`split("", array)` (3认同)
  • 替代的拆分解决方案很有帮助。令人惊讶的是,尽管手册页说下标是可选的,但 SCO Openserver 5.0.7 awk 调用 `delete array` 是一个语法错误。`$ awk '开始 { A[1] = 0; 删除A;}' awk: 程序 << BEGIN { A[1] = 0; 的第 1 行出现语法错误 de ... >> 上下文是 BEGIN { A[1] = 0; 删除>>> A;<<< awk: 程序第 1 行有非法语句 << BEGIN { A[1] = 0; de ... >>` 更令人惊讶的是,发现 `delete array[subscript]` 虽然没有显示为错误,但也不起作用,并且 `array[subscript] = ""` 上的许多变体都同样有效无效。 (2认同)