Удалить массив в awk


18

В awk я могу очистить массив с помощью цикла, сделав его пустым, что эквивалентно его удалению.

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

Есть ли более простой способ? Можно ли полностью удалить массив, чтобы имя переменной можно было повторно использовать для скаляра?

Ответы:


29

Синтаксис

delete array

отсутствует в текущих версиях POSIX, но поддерживается практически всеми существующими реализациями (включая оригинальные awk, GNU, mawk и BusyBox). Он будет добавлен в будущей версии POSIX (см. Дефект 0000544 ).

Альтернативный способ очистки всех элементов массива, который является переносимым и совместимым со стандартом и который является выражением, а не оператором, заключается в splitудалении всех существующих элементов:

split("", array, ":")

Все это, в том числе delete array, оставляет переменную помеченной как переменная массива в оригинальном awk, в GNU awk и в mawk (но не в BusyBox awk). Насколько я знаю, когда переменная используется в качестве массива, ее нельзя использовать как скалярную переменную.


Альтернативное сплит-решение оказалось полезным. Было неожиданностью обнаружить, что SCO Openserver 5.0.7 awk вызывает delete arrayсинтаксическую ошибку, хотя на странице руководства написано, что индекс не является обязательным. $ awk 'BEGIN { A[1] = 0; delete A; }' awk: Syntax error at line 1 of program << BEGIN { A[1] = 0; de ... >> context is BEGIN { A[1] = 0; delete >>> A; <<< awk: illegal statement at line 1 of program << BEGIN { A[1] = 0; de ... >>Более удивительно было обнаружить, что delete array[subscript], хотя это и не показано как ошибка, оно также не работает, и многие варианты в array[subscript] = ""равной степени неэффективны.
kbulgrien

1
Или простоsplit("", array)
ryenus
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.