Computer >> คอมพิวเตอร์ >  >> ระบบ >> Linux

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

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

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

พื้นฐาน AWK

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

awk 'pattern {action}' input-file > output-file

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

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

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

1, Justin Timberlake, Title 545, Price $7.30
2, Taylor Swift, Title 723, Price $7.90
3, Mick Jagger, Title 610, Price $7.90
4, Lady Gaga, Title 118, Price $7.30
5, Johnny Cash, Title 482, Price $6.50
6, Elvis Presley, Title 335, Price $7.30
7, John Lennon, Title 271, Price $7.90
8, Michael Jackson, Title 373, Price $5.50

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

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

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

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

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

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

นิพจน์เงื่อนไขใน AWK

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

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 ของบรรทัดนั้น ผลลัพธ์ในตัวอย่างข้างต้นจะเป็น:

Timberlake,
Gaga,
Presley,

ทำการคำนวณใน AWK

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

awk '{ print ($2 * $3) + $7 }'

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

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

awk '{ sum=0; for (col=1; col<=NF; col++) sum += $col; print sum; }'

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

คำสั่ง awk มักใช้ร่วมกับคำสั่ง sed