ค้นหาเว็บไซต์

วิธีใช้ 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

ในตัวอย่างนี้ เราได้ใช้สองรูปแบบ:

  1. อันแรก: / *\$[2-9]\.[0-9][0-9] */ รับบรรทัดที่มีราคารายการอาหารมากกว่า $2 และ
  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