วิธีการเขียนคำสั่ง AWK และสคริป

คำสั่งไวยากรณ์และตัวอย่าง

คำสั่ง awk เป็นวิธีที่มีประสิทธิภาพในการประมวลผลหรือวิเคราะห์ไฟล์ข้อความโดยเฉพาะอย่างยิ่งไฟล์ข้อมูลที่จัดโดยบรรทัด (แถว) และคอลัมน์

คำสั่ง awk ง่ายสามารถเรียกใช้จาก บรรทัดคำสั่ง งานที่ซับซ้อนมากขึ้นควรเขียนเป็นโปรแกรม awk (เรียกว่าสคริปต์ awk) ไปยังไฟล์

รูปแบบพื้นฐานของคำสั่ง awk มีลักษณะดังนี้:

awk 'pattern {action}' input-file> ไฟล์ที่ส่งออก

ซึ่งหมายความว่า: ใช้แต่ละบรรทัดของแฟ้มใส่; ถ้าบรรทัดประกอบด้วยรูปแบบใช้การดำเนินการกับบรรทัดและเขียนบรรทัดผลลัพธ์เป็นไฟล์ผลลัพธ์ หากรูปแบบถูกละไว้การดำเนินการจะใช้กับทุกบรรทัด ตัวอย่างเช่น:

awk '{print $ 5}' table1.txt> output1.txt

คำสั่งนี้ใช้องค์ประกอบของคอลัมน์ที่ 5 ของแต่ละบรรทัดและเขียนเป็นบรรทัดในไฟล์ที่ส่งออก "output.txt" ตัวแปร '$ 4' หมายถึงคอลัมน์ที่สอง ในทำนองเดียวกันคุณสามารถเข้าถึงคอลัมน์แรกสองและสามโดยมีค่า 1 $ 2 $ 3 เป็นต้นโดยค่าเริ่มต้นคอลัมน์จะถูกคั่นด้วยช่องว่างหรือแท็บ (เรียกว่าช่องว่างสีขาว) ดังนั้นหากไฟล์ input "table1.txt" มีบรรทัดเหล่านี้:

1, จัสตินทิมเบอร์เลค, ชื่อเรื่อง 545, ราคา $ 7.30 2, Taylor Swift, ชื่อเรื่อง 723, ราคา 7.90 เหรียญ 3, Mick Jagger, ชื่อเรื่อง 610, ราคา 7.90 เหรียญ 4, Lady Gaga, ชื่อเรื่อง 118, ราคา 7.30 $ 5, Johnny Cash, Title 482, Price $ 6.50 6, Elvis Presley, Title 335, Price $ 7.30 7, John Lennon, Title 271, ราคา $ 7.90 8, Michael Jackson, ชื่อเรื่อง 373, ราคา 5.50 เหรียญ

จากนั้นคำสั่งจะเขียนบรรทัดต่อไปนี้ไปยังไฟล์ที่ส่งออก "output1.txt":

545, 723, 610, 118, 482, 335, 271, 373,

ถ้าตัวแบ่งคอลัมน์เป็นสิ่งอื่นที่ไม่ใช่ช่องว่างหรือแท็บเช่นเครื่องหมายจุลภาคคุณสามารถระบุได้ว่าในคำสั่ง awk ดังนี้:

awk -F, '{print $ 3}' table1.txt> output1.txt

ซึ่งจะเลือกองค์ประกอบจากคอลัมน์ 3 ของแต่ละบรรทัดหากคอลัมน์มีการพิจารณาให้คั่นด้วยเครื่องหมายจุลภาค ดังนั้นเอาท์พุทในกรณีนี้จะเป็น:

ชื่อเรื่อง 545 ชื่อเรื่อง 723 ชื่อเรื่อง 610 ชื่อเรื่อง 118 ชื่อเรื่อง 482 ชื่อเรื่อง 335 ชื่อเรื่อง 271 ชื่อเรื่อง 373

รายการคำสั่งภายในวงเล็บปีกกา ('{', '}') เรียกว่า block ถ้าคุณใส่นิพจน์เงื่อนไขไว้หน้าบล็อกคำสั่งภายในบล็อกจะถูกเรียกใช้เฉพาะเมื่อเงื่อนไขเป็นจริงเท่านั้น

awk '$ 7 == "\ $ 7.30" {print $ 3}' table1.txt

ในกรณีนี้เงื่อนไขคือ $ 7 == "\ $ 7.30" ซึ่งหมายความว่าองค์ประกอบที่คอลัมน์ 7 มีค่าเท่ากับ $ 7.30 เครื่องหมายทับขวาที่ด้านหน้าของเครื่องหมายดอลลาร์ถูกใช้เพื่อป้องกันไม่ให้ระบบแปลค่าตัวแปรเป็น 7 เหรียญแทนการใช้เครื่องหมายดอลลาร์แทนตัวอักษร

ดังนั้นคำสั่ง awk นี้จะพิมพ์องค์ประกอบที่คอลัมน์ที่ 3 ของแต่ละบรรทัดที่มี "$ 7.30" ที่คอลัมน์ 7

นอกจากนี้คุณยังสามารถใช้ นิพจน์ปกติ เป็นเงื่อนไขได้เช่นกัน ตัวอย่างเช่น:

awk '/ 30 / {print $ 3}' table1.txt

สายอักขระระหว่างเครื่องหมายทับสอง ('/') คือนิพจน์ปกติ ในกรณีนี้เป็นเพียงสตริง "30" ซึ่งหมายความว่าถ้าบรรทัดประกอบด้วยสตริง "30" ระบบจะพิมพ์องค์ประกอบที่คอลัมน์ที่ 3 ของบรรทัดนั้น ผลลัพธ์ในตัวอย่างข้างต้นจะเป็น:

ทิมเบอร์เลค, กาก้า, เพรสลีย์,

ถ้าองค์ประกอบของตารางเป็นตัวเลข awk สามารถเรียกใช้การคำนวณได้เช่นในตัวอย่างนี้:

awk '{พิมพ์ ($ 2 * $ 3) + $ 7}'

นอกเหนือจากตัวแปรที่เข้าถึงองค์ประกอบของแถวปัจจุบัน ($ 1, $ 2, ฯลฯ ) มีตัวแปร $ 0 ซึ่งหมายถึงแถวสมบูรณ์ (บรรทัด) และตัวแปร NF ที่มีจำนวนฟิลด์

นอกจากนี้คุณยังสามารถกำหนดตัวแปรใหม่เช่นในตัวอย่างนี้:

awk '{sum = 0; สำหรับ (col = 1; col <= NF; col ++) sum + = $ col; ผลรวมพิมพ์; }'

คำนวณและพิมพ์ผลรวมขององค์ประกอบทั้งหมดของแต่ละแถว

คำสั่ง Awk จะรวมกันบ่อยๆกับ คำสั่ง sed