Eliminar una matriz en awk


18

En awk, puedo borrar una matriz con un bucle, convirtiéndola en una matriz vacía, lo que equivale a eliminarla.

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

¿Hay una manera más sencilla? ¿Puedo eliminar por completo una matriz para que el nombre de la variable pueda reutilizarse para un escalar?

Respuestas:


29

La sintaxis

delete array

no está en las versiones actuales en POSIX, pero es compatible con prácticamente todas las implementaciones existentes (incluidas las awk, GNU, mawk y BusyBox originales). Se agregará en una versión futura de POSIX (consulte el defecto 0000544 ).

Una forma alternativa de borrar todos los elementos de la matriz, que es portátil y compatible con el estándar, y que es una expresión en lugar de una declaración, es confiar en spliteliminar todos los elementos existentes:

split("", array, ":")

Todos estos, incluidos delete array, dejan la variable marcada como una variable de matriz en el awk original, en GNU awk y en mawk (pero no en BusyBox awk). Hasta donde sé, una vez que una variable se ha utilizado como una matriz, no hay forma de usarla como una variable escalar.


La solución alternativa dividida fue útil. Fue una sorpresa encontrar que SCO Openserver 5.0.7 awk llama delete arrayun error de sintaxis, aunque la página del manual dice que el subíndice es 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 ... >>Fue más sorprendente encontrar que delete array[subscript], si bien no se muestra como un error, tampoco funcionó, y muchas variantes en array[subscript] = ""fueron igualmente ineficaces.
kbulgrien

1
O simplementesplit("", array)
ryenus
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.