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?

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.