awkから配列を削除する

awkから配列を削除する

awkでは、ループを使用して配列を消去して空の配列にすることができます。これは配列を削除するのと同じです。

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

より簡単な方法がありますか?変数名をスカラーで再利用できるように配列を完全に削除できますか?

答え1

文法

delete array

現在のバージョンのPOSIXではサポートされていませんが、ほとんどすべての既存の実装(元のawk、GNU、mawk、およびBusyBoxを含む)はこれをサポートしています。 POSIXの将来のバージョンに追加される予定です。欠陥0000544)。

すべての配列要素を消去する代替方法は、split既存の要素をすべて削除することです。これは移植可能で標準に準拠し、文ではなく式です。

split("", array)

を含むこれらのすべては、delete array元のawk、GNU awk、およびmawkの変数を配列変数として表示します(BusyBox awkではありません)。私が知っている限り、変数が配列として使用される場合、スカラー変数として使用することはできません。

答え2

これがなぜ良いアイデアなのかはわかりませんが、配列とスカラーと同じ名前を使用し、同じスコープで使用しない場合は、次のようにすることができます.

$ cat tst.awk
BEGIN {
    fooIsArray()
    foo = 17
    print "foo is a scalar:", foo
}

function fooIsArray(    foo) {
    foo[1] = "bar"
    print "foo is an array:", foo[1]
}

$ awk -f tst.awk
foo is an array: bar
foo is a scalar: 17

上記では、foo[]関数の未使用パラメータとして宣言して関数ローカル変数を作成しましたfooIsArray()。したがって、スクリプトの他の場所で使用されるグローバルスカラー変数とは関係がなく、配列fooの内容はfoo[]関数から返されると削除されます。fooIsArray()

関連情報