Usuń tablicę w awk

18

W awk mogę wyczyścić tablicę za pomocą pętli, co czyni ją pustą tablicą, co jest równoważne z jej usunięciem.

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

Czy istnieje prostszy sposób? Czy mogę całkowicie usunąć tablicę, aby nazwa zmiennej mogła być ponownie użyta do skalara?

Gilles „SO- przestań być zły”
źródło

Odpowiedzi:

29

Składnia

delete array

nie jest w aktualnych wersjach POSIX, ale jest obsługiwany przez praktycznie wszystkie istniejące implementacje (w tym oryginalny awk, GNU, mawk i BusyBox). Zostanie dodany w przyszłej wersji POSIX (patrz wada 0000544 ).

Alternatywnym sposobem na usunięcie wszystkich elementów tablicy, który jest zarówno przenośny, jak i zgodny ze standardami i który jest raczej wyrażeniem niż instrukcją, jest poleganie na splitusunięciu wszystkich istniejących elementów:

split("", array, ":")

Wszystkie te, w tym delete arraypozostaw zmienną oznaczoną jako zmienna tablicowa w oryginalnym awk, w GNU awk i mawk (ale nie w BusyBox awk). O ile mi wiadomo, kiedy zmienna zostanie użyta jako tablica, nie ma możliwości użycia jej jako zmiennej skalarnej.

Gilles „SO- przestań być zły”
źródło
Pomocne było alternatywne rozwiązanie podziału. Zaskakujące było to, że awo SCO Openserver 5.0.7 wywołuje delete arraybłąd składniowy, chociaż strona podręcznika mówi, że indeks dolny jest opcjonalny. $ 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 ... >>Bardziej zaskakujące było stwierdzenie, że delete array[subscript]chociaż nie pokazano tego jako błędu, również nie działało, a wiele wariantów na array[subscript] = ""wszystkich było równie nieskutecznych.
kbulgrien
1
Lub po prostusplit("", array)
ryenus