Excluir uma matriz no awk

18

No awk, posso limpar uma matriz com um loop, tornando-a vazia, o que equivale a excluí-la.

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

Existe uma maneira mais simples? Posso excluir completamente uma matriz, para que o nome da variável possa ser reutilizado para um escalar?

Gilles 'SO- parar de ser mau'
fonte

Respostas:

29

A sintaxe

delete array

não está nas versões atuais do POSIX, mas é suportado por praticamente todas as implementações existentes (incluindo o awk original, GNU, mawk e BusyBox). Ele será adicionado em uma versão futura do POSIX (consulte o defeito 0000544 ).

Uma maneira alternativa de limpar todos os elementos da matriz, que são portáteis e compatíveis com os padrões, e que é uma expressão e não uma declaração, é confiar na splitexclusão de todos os elementos existentes:

split("", array, ":")

Tudo isso, inclusive delete array, deixa a variável marcada como sendo uma variável de matriz no awk original, no GNU awk e no mawk (mas não no BusyBox awk). Até onde eu sei, uma vez que uma variável tenha sido usada como uma matriz, não há como usá-la como uma variável escalar.

Gilles 'SO- parar de ser mau'
fonte
A solução alternativa de divisão foi útil. Foi uma surpresa descobrir que o SCO Openserver 5.0.7 awk chama delete arrayum erro de sintaxe, embora a página de manual diga que o subscrito é opcional. $ 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 ... >>Foi mais surpreendente descobrir que delete array[subscript], embora não tenha sido mostrado como um erro, também não funcionou, e muitas variantes array[subscript] = ""foram todas igualmente ineficazes.
precisa saber é o seguinte
1
Ou apenassplit("", array)
ryenus 27/09