Hapus array di awk

18

Dalam awk, saya bisa menghapus array dengan sebuah loop, menjadikannya array kosong, yang setara dengan menghapusnya.

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

Apakah ada cara yang lebih sederhana? Bisakah saya sepenuhnya menghapus array, sehingga nama variabel dapat digunakan kembali untuk skalar?

Gilles 'SANGAT berhenti menjadi jahat'
sumber

Jawaban:

29

Sintaksnya

delete array

tidak dalam versi saat ini di POSIX, tetapi didukung oleh hampir semua implementasi yang ada (termasuk awk asli, GNU, mawk, dan BusyBox). Ini akan ditambahkan dalam versi POSIX masa depan (lihat cacat 0000544 ).

Cara alternatif untuk menghapus semua elemen array, yang portabel dan memenuhi standar, dan yang merupakan ekspresi daripada pernyataan, adalah dengan mengandalkan split penghapusan semua elemen yang ada:

split("", array, ":")

Semua ini, termasuk delete array, biarkan variabel ditandai sebagai variabel array di awk asli, di GNU awk dan di mawk (tetapi tidak di BusyBox awk). Sejauh yang saya tahu, setelah sebuah variabel digunakan sebagai array, tidak ada cara untuk menggunakannya sebagai variabel skalar.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Solusi pemecahan alternatif sangat membantu. Itu mengejutkan untuk menemukan SCO Openserver 5.0.7 awk menyebut delete arraykesalahan sintaksis meskipun halaman manual mengatakan subskrip adalah opsional. $ 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 ... >>Itu lebih mengejutkan untuk menemukan bahwa delete array[subscript], sementara tidak ditampilkan sebagai kesalahan, juga tidak berfungsi, dan banyak varian pada array[subscript] = ""semua sama-sama tidak efektif.
kbulgrien
1
Atau hanyasplit("", array)
ryenus