Elimina un array in awk


18

In awk, posso cancellare un array con un loop, rendendolo un array vuoto, il che equivale a eliminarlo.

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

c'è un modo più facile? Posso eliminare completamente un array, in modo che il nome della variabile possa essere riutilizzato per uno scalare?

Risposte:


29

La sintassi

delete array

non è nelle versioni correnti in POSIX, ma è supportato praticamente da tutte le implementazioni esistenti (inclusi awk, GNU, mawk e BusyBox originali). Verrà aggiunto in una versione futura di POSIX (vedere difetto 0000544 ).

Un modo alternativo per cancellare tutti gli elementi dell'array, che è sia portatile che conforme agli standard, e che è un'espressione piuttosto che un'istruzione, è fare affidamento splitsull'eliminazione di tutti gli elementi esistenti:

split("", array, ":")

Tutti questi, incluso delete array, lasciano la variabile contrassegnata come variabile array in awk originale, in GNU awk e in mawk (ma non in BusyBox awk). Per quanto ne so, una volta che una variabile è stata utilizzata come una matrice, non c'è modo di usarla come variabile scalare.


La soluzione alternativa suddivisa è stata utile. È stata una sorpresa scoprire che awk SCO OpenServer 5.0.7 chiama delete arrayun errore di sintassi sebbene la pagina man dica che il pedice è facoltativo. $ 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 ... >>È stato più sorprendente scoprire che delete array[subscript], sebbene non mostrato come un errore, anche non ha funzionato, e molte varianti su array[subscript] = ""erano tutte ugualmente inefficaci.
kbulgrien,

1
O semplicementesplit("", array)
Ryenus il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.