Xóa một mảng trong awk


18

Trong awk, tôi có thể xóa một mảng bằng một vòng lặp, biến nó thành một mảng trống, tương đương với việc xóa nó.

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

đó có phải là cách dễ hơn? Tôi có thể xóa hoàn toàn một mảng để tên biến có thể được sử dụng lại cho vô hướng không?

Câu trả lời:


29

Cú pháp

delete array

không có trong các phiên bản hiện tại trong POSIX, nhưng nó được hỗ trợ bởi hầu như tất cả các triển khai hiện có (bao gồm awk ban đầu, GNU, mawk và BusyBox). Nó sẽ được thêm vào trong phiên bản tương lai của POSIX (xem lỗi 0000544 ).

Một cách khác để xóa tất cả các thành phần mảng, cả di động và tuân thủ tiêu chuẩn, và đó là một biểu thức chứ không phải là một tuyên bố, là dựa vào việc splitxóa tất cả các thành phần hiện có:

split("", array, ":")

Tất cả những thứ này, bao gồm delete array, để lại biến được đánh dấu là biến mảng trong awk gốc, trong GNU awk và mawk (nhưng không phải trong BusyBox awk). Theo tôi biết, một khi một biến đã được sử dụng như một mảng, không có cách nào để sử dụng nó như một biến vô hướng.


Các giải pháp phân chia thay thế là hữu ích. Thật bất ngờ khi thấy SCO Openserver 5.0.7 awk gọi delete arraymột lỗi cú pháp mặc dù trang man nói rằng chỉ mục là không bắt buộc. $ 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 ... >>Điều đáng ngạc nhiên hơn là phát hiện ra rằng delete array[subscript], mặc dù không hiển thị là lỗi, nhưng cũng không hoạt động và nhiều biến thể trên array[subscript] = ""đều không hiệu quả như nhau.
kbulgrien

1
Hoặc chỉsplit("", array)
ryenus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.