วิธีใช้ Awk เพื่อกรองข้อความหรือสตริงโดยใช้การดำเนินการเฉพาะรูปแบบ
ในส่วนที่สามของชุดคำสั่ง Awk เราจะดูการกรองข้อความหรือสตริงตามรูปแบบเฉพาะที่ผู้ใช้สามารถกำหนดได้
บางครั้ง เมื่อกรองข้อความ คุณต้องการระบุบรรทัดบางบรรทัดจากไฟล์อินพุตหรือบรรทัดของสตริงตามเงื่อนไขที่กำหนด หรือใช้รูปแบบเฉพาะที่สามารถจับคู่ได้ การทำสิ่งนี้ด้วย Awk นั้นง่ายมาก นี่เป็นหนึ่งในคุณสมบัติที่ยอดเยี่ยมของ Awk ที่คุณจะพบว่ามีประโยชน์
เรามาดูตัวอย่างด้านล่างกัน สมมติว่าคุณมีรายการช้อปปิ้งสำหรับรายการอาหารที่คุณต้องการซื้อที่เรียกว่า food_prices.list มีรายการอาหารและราคาดังต่อไปนี้
$ cat food_prices.list
No Item_Name Quantity Price
1 Mangoes 10 $2.45
2 Apples 20 $1.50
3 Bananas 5 $0.90
4 Pineapples 10 $3.46
5 Oranges 10 $0.78
6 Tomatoes 5 $0.55
7 Onions 5 $0.45
จากนั้น คุณต้องการระบุเครื่องหมาย (*)
บนรายการอาหารที่มีราคามากกว่า $2
ซึ่งสามารถทำได้โดยการรันคำสั่งต่อไปนี้:
awk '/ *$[2-9]\.[0-9][0-9] */ { print $1, $2, $3, $4, "*" ; } / *$[0-1]\.[0-9][0-9] */ { print ; }' food_prices.list
จากผลลัพธ์ด้านบน คุณจะเห็นว่ามีเครื่องหมาย (*)
ที่ท้ายบรรทัดที่มีรายการอาหาร มะม่วง และ สับปะรด . หากคุณตรวจสอบราคา ราคาจะอยู่เหนือ $2
ในตัวอย่างนี้ เราได้ใช้สองรูปแบบ:
- อันแรก:
/ *\$[2-9]\.[0-9][0-9] */
รับบรรทัดที่มีราคารายการอาหารมากกว่า $2 และ - ประการที่สอง:
/*\$[0-1]\.[0-9][0-9] */
ค้นหาบรรทัดที่มีราคารายการอาหารน้อยกว่า $2 .
นี่คือสิ่งที่เกิดขึ้น มีสี่ฟิลด์ในไฟล์ เมื่อรูปแบบหนึ่งพบบรรทัดที่มีราคารายการอาหารมากกว่า $2 รูปแบบจะพิมพ์ทั้งสี่ฟิลด์และ (*)
เซ็นชื่อที่ท้ายบรรทัดเป็นธง
รูปแบบที่สองเพียงพิมพ์บรรทัดอื่นๆ ที่มีราคาอาหารน้อยกว่า $2 ตามที่ปรากฏในไฟล์อินพุต food_prices.list
วิธีนี้ทำให้คุณสามารถใช้การดำเนินการเฉพาะรูปแบบเพื่อกรองรายการอาหารที่มีราคาสูงกว่า $2 แม้ว่าจะมีปัญหากับเอาต์พุต ซึ่งเป็นบรรทัดที่มี (*)
เครื่องหมายไม่ได้รับการจัดรูปแบบเหมือนกับบรรทัดอื่นๆ ทำให้ผลลัพธ์ไม่ชัดเจนเพียงพอ
เราเห็นปัญหาเดียวกันในตอนที่ 2 ของซีรีส์ awk แต่เราสามารถแก้ไขได้สองวิธี:
1. การใช้คำสั่ง printf ซึ่งเป็นวิธีที่ยาวและน่าเบื่อโดยใช้คำสั่งด้านล่าง:
awk '/ *$[2-9]\.[0-9][0-9] */ { printf "%-10s %-10s %-10s %-10s\n", $1, $2, $3, $4 "*" ; } / *$[0-1]\.[0-9][0-9] */ { printf "%-10s %-10s %-10s %-10s\n", $1, $2, $3, $4; }' food_prices.list
2. ใช้ฟิลด์ $0 Awk ใช้ตัวแปร 0 เพื่อจัดเก็บบรรทัดอินพุตทั้งหมด สิ่งนี้มีประโยชน์สำหรับการแก้ปัญหาข้างต้นและทำได้ง่ายและรวดเร็วดังนี้:
awk '/ *$[2-9]\.[0-9][0-9] */ { print $0 "*" ; } / *$[0-1]\.[0-9][0-9] */ { print ; }' food_prices.list
บทสรุป
เพียงเท่านี้และนี่คือวิธีง่ายๆ ในการกรองข้อความโดยใช้การดำเนินการเฉพาะรูปแบบ ซึ่งสามารถช่วยในการตั้งค่าสถานะบรรทัดข้อความหรือสตริงในไฟล์โดยใช้คำสั่ง Awk
หวังว่าบทความนี้จะมีประโยชน์ และอย่าลืมอ่านส่วนถัดไปของซีรีส์ซึ่งจะเน้นที่การใช้ตัวดำเนินการเปรียบเทียบโดยใช้เครื่องมือ awk