Supprimer un tableau dans awk

18

Dans awk, je peux effacer un tableau avec une boucle, ce qui en fait un tableau vide, ce qui équivaut à le supprimer.

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

Existe-t-il un moyen plus simple? Puis-je supprimer complètement un tableau, afin que le nom de la variable puisse être réutilisé pour un scalaire?

Gilles 'SO- arrête d'être méchant'
la source

Réponses:

29

La syntaxe

delete array

n'est pas dans les versions actuelles de POSIX, mais il est pris en charge par pratiquement toutes les implémentations existantes (y compris les awk, GNU, mawk et BusyBox d'origine). Il sera ajouté dans une future version de POSIX (voir défaut 0000544 ).

Une autre façon d'effacer tous les éléments du tableau, qui est à la fois portable et conforme aux normes, et qui est une expression plutôt qu'une instruction, consiste à s'appuyer sur la splitsuppression de tous les éléments existants:

split("", array, ":")

Tous ces éléments, y compris delete array, laissent la variable marquée comme étant une variable de tableau dans le awk d'origine, dans le awk GNU et dans le mawk (mais pas dans le awk BusyBox). Pour autant que je sache, une fois qu'une variable a été utilisée comme un tableau, il n'y a aucun moyen de l'utiliser comme une variable scalaire.

Gilles 'SO- arrête d'être méchant'
la source
La solution de fractionnement alternative a été utile. Ce fut une surprise de voir que SCO Openserver 5.0.7 awk appelle delete arrayune erreur de syntaxe bien que la page de manuel indique que l'indice est facultatif. $ 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 ... >>Il était plus surprenant de constater que delete array[subscript], bien que cela ne soit pas montré comme une erreur, cela ne fonctionnait pas non plus, et de nombreuses variantes sur array[subscript] = ""étaient toutes également inefficaces.
kbulgrien
1
Ou tout simplementsplit("", array)
ryenus