ลบอาร์เรย์ใน awk


18

ใน awk ฉันสามารถล้างอาเรย์ด้วยลูปทำให้เป็นอาเรย์ที่ว่างเปล่าซึ่งเทียบเท่ากับการลบมัน

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

มีวิธีที่ง่ายกว่านี้ไหม? ฉันสามารถลบอาร์เรย์ทั้งหมดเพื่อให้สามารถใช้ชื่อตัวแปรสำหรับสเกลาร์ได้หรือไม่

คำตอบ:


29

ไวยากรณ์

delete array

ไม่ได้อยู่ในเวอร์ชันปัจจุบันใน POSIX แต่ได้รับการสนับสนุนโดยการใช้งานที่มีอยู่ทั้งหมด (รวมถึง awk, GNU, mawk และ BusyBox ดั้งเดิม) มันจะถูกเพิ่มในรุ่นอนาคตของ POSIX (ดูข้อบกพร่อง 0000544 )

วิธีอื่นในการล้างองค์ประกอบอาร์เรย์ทั้งหมดซึ่งเป็นทั้งแบบพกพาและได้มาตรฐานและซึ่งเป็นนิพจน์แทนที่จะเป็นคำสั่งคือการพึ่งพาการsplitลบองค์ประกอบที่มีอยู่ทั้งหมด:

split("", array, ":")

สิ่งเหล่านี้รวมถึงdelete arrayปล่อยตัวแปรที่ทำเครื่องหมายว่าเป็นตัวแปรอาร์เรย์ใน awk ดั้งเดิมใน GNU awk และใน mawk (แต่ไม่ใช่ใน BusyBox awk) เท่าที่ฉันรู้เมื่อตัวแปรถูกใช้เป็นอาร์เรย์จะไม่มีวิธีใช้เป็นตัวแปรสเกลาร์


โซลูชันแยกทางเลือกมีประโยชน์ มันน่าแปลกใจที่พบ SCO Openserver 5.0.7 awk เรียกdelete arrayข้อผิดพลาดทางไวยากรณ์แม้ว่าหน้า man จะบอกว่าตัวห้อยนั้นเป็นตัวเลือก $ 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 ... >>มันน่าแปลกใจมากที่พบว่าdelete array[subscript]ในขณะที่ไม่ได้แสดงให้เห็นว่าเป็นข้อผิดพลาดก็ไม่ได้ผลและหลายสายพันธุ์array[subscript] = ""ก็ไม่ได้ผลเท่ากัน
kbulgrien

1
หรือเพียงแค่split("", array)
ryenus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.