Löschen Sie ein Array in awk


18

In awk kann ich ein Array mit einer Schleife löschen, wodurch es ein leeres Array wird, was dem Löschen entspricht.

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

Gibt es einen einfacheren Weg? Kann ich ein Array vollständig löschen, damit der Variablenname für einen Skalar wiederverwendet werden kann?

Antworten:


29

Die Syntax

delete array

ist nicht in aktuellen POSIX-Versionen enthalten, wird jedoch von praktisch allen vorhandenen Implementierungen (einschließlich der ursprünglichen awk, GNU, mawk und BusyBox) unterstützt. Es wird in einer zukünftigen Version von POSIX hinzugefügt (siehe Fehler 0000544 ).

Eine alternative Methode zum Löschen aller Array-Elemente, die sowohl portabel als auch standardkonform ist und eher ein Ausdruck als eine Anweisung ist, besteht darin, splitalle vorhandenen Elemente zu löschen:

split("", array, ":")

In allen diesen delete arrayFällen bleibt die Variable in der ursprünglichen awk, in der GNU awk und in der mawk als Array-Variable markiert (jedoch nicht in der BusyBox awk). Soweit ich weiß, gibt es keine Möglichkeit, eine einmal als Array verwendete Variable als skalare Variable zu verwenden.


Die alternative Split-Lösung war hilfreich. Es war eine Überraschung, dass SCO Openserver 5.0.7 awk delete arrayeinen Syntaxfehler aufruft , obwohl die Manpage angibt, dass der Index optional ist. $ 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 ... >>Es war überraschender festzustellen, dass delete array[subscript], obwohl dies nicht als Fehler angezeigt wurde, dies auch nicht funktionierte und viele Varianten array[subscript] = ""gleichermaßen unwirksam waren.
kbulgrien

1
Oder einfachsplit("", array)
Ryenus
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.