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

วิธีใช้คำสั่ง 'next' กับ Awk ใน Linux - ตอนที่ 6


ในส่วนที่หกของซีรีส์ Awk นี้ เราจะดูที่การใช้คำสั่ง next ซึ่งบอกให้ Awk ให้ข้ามรูปแบบและนิพจน์ที่เหลือทั้งหมดที่คุณระบุไว้ แต่อ่านคำสั่งถัดไปแทน สายอินพุต

คำสั่ง next ช่วยให้คุณป้องกันการดำเนินการสิ่งที่ฉันเรียกว่าขั้นตอนการเสียเวลาในการดำเนินการคำสั่ง

เพื่อให้เข้าใจถึงวิธีการทำงาน ให้เราพิจารณาไฟล์ชื่อ food_list.txt ที่มีลักษณะดังนี้:

No      Item_Name               Price           Quantity
1       Mangoes                 $3.45              5
2       Apples                  $2.45              25
3       Pineapples              $4.45              55
4       Tomatoes                $3.45              25
5       Onions                  $1.45              15
6       Bananas                 $3.45              30

พิจารณาเรียกใช้คำสั่งต่อไปนี้เพื่อทำเครื่องหมายรายการอาหารที่มีปริมาณน้อยกว่าหรือเท่ากับ 20 โดยมีเครื่องหมาย (*) ที่ท้ายแต่ละบรรทัด:

# awk '$4 <= 20 { printf "%s\t%s\n", $0,"*" ; } $4 > 20 { print $0 ;} ' food_list.txt 

No	Item_Name		Price		Quantity
1	Mangoes			$3.45		   5	*
2	Apples			$2.45              25
3	Pineapples		$4.45              55
4	Tomatoes		$3.45              25 
5	Onions			$1.45              15	*
6	Bananas	                $3.45              30

คำสั่งข้างต้นใช้งานได้จริงดังนี้:

  1. ขั้นแรก จะตรวจสอบว่าปริมาณ ฟิลด์ที่สี่ของแต่ละบรรทัดอินพุตน้อยกว่าหรือเท่ากับ 20 หากค่าตรงตามเงื่อนไขนั้น ระบบจะพิมพ์และทำเครื่องหมายด้วย (*) ลงชื่อที่ส่วนท้ายโดยใช้นิพจน์ที่หนึ่ง: $4 <= 20
  2. ประการที่สอง จะตรวจสอบว่าฟิลด์ที่สี่ของแต่ละบรรทัดอินพุตมากกว่า 20 หรือไม่ และหากบรรทัดตรงตามเงื่อนไขจะถูกพิมพ์โดยใช้นิพจน์ที่สอง: $4 > 20

แต่มีปัญหาอย่างหนึ่งที่นี่ เมื่อดำเนินการ นิพจน์แรก บรรทัดที่เราต้องการแฟล็กจะถูกพิมพ์โดยใช้: { printf "%s\t%s\n", $0, "**" ; } จากนั้นในขั้นตอนเดียวกัน นิพจน์ที่สอง จะถูกตรวจสอบด้วย ซึ่งจะกลายเป็นปัจจัยที่เสียเวลา

ดังนั้นจึงไม่จำเป็นต้องดำเนินการนิพจน์ที่สอง $4 > 20 อีกครั้งหลังจากพิมพ์บรรทัดที่ติดธงไว้แล้วซึ่งพิมพ์โดยใช้นิพจน์แรก

เพื่อจัดการกับปัญหานี้ คุณต้องใช้คำสั่ง next ดังนี้:

# awk '$4 <= 20 { printf "%s\t%s\n", $0,"*" ; next; } $4 > 20 { print $0 ;} ' food_list.txt

No	Item_Name		Price		Quantity
1	Mangoes			$3.45		   5	*
2	Apples			$2.45              25
3	Pineapples		$4.45              55
4	Tomatoes		$3.45              25 
5	Onions			$1.45              15	*
6	Bananas	                $3.45              30

หลังจากพิมพ์บรรทัดอินพุตเดียวโดยใช้ $4 <= 20 { printf "%s\t%s\n", $0,"*" ; ต่อไป ; } คำสั่ง ถัดไป ที่รวมไว้จะช่วยข้ามนิพจน์ที่สอง $4 > 20 { print $0 ;} ดังนั้นการดำเนินการจึงไปที่ บรรทัดอินพุตถัดไปโดยไม่ต้องเสียเวลาตรวจสอบว่าปริมาณมากกว่า 20 หรือไม่

คำสั่ง ถัดไป มีความสำคัญมากคือการเขียนคำสั่งที่มีประสิทธิภาพ และเมื่อจำเป็น คุณสามารถใช้เพื่อเพิ่มความเร็วในการเรียกใช้สคริปต์ได้ตลอดเวลา เตรียมพร้อมสำหรับส่วนถัดไปของซีรีส์นี้ ซึ่งเราจะดูการใช้อินพุตมาตรฐาน (STDIN) เป็นอินพุตสำหรับ Awk

หวังว่าคำแนะนำนี้จะเป็นประโยชน์และคุณสามารถเขียนความคิดของคุณเป็นลายลักษณ์อักษรได้เช่นเคยโดยแสดงความคิดเห็นในส่วนความคิดเห็นด้านล่าง