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

วิธีใช้ Awk เพื่อพิมพ์ฟิลด์และคอลัมน์ในไฟล์


ในส่วนนี้ของชุดคำสั่ง Linux Awk เราจะมาดูคุณลักษณะที่สำคัญที่สุดประการหนึ่งของ Awk ซึ่งก็คือการแก้ไขฟิลด์

เป็นเรื่องน่ารู้ที่ Awk จะแบ่งบรรทัดอินพุตที่ระบุออกเป็นช่องต่างๆ โดยอัตโนมัติ และช่องสามารถกำหนดเป็นชุดอักขระที่แยกออกจากช่องอื่นๆ ด้วยตัวคั่นช่องภายใน

หากคุณคุ้นเคยกับ Unix/Linux หรือเขียนโปรแกรม bash shell คุณควรรู้ว่าตัวแปรตัวคั่นฟิลด์ภายใน (IFS) คืออะไร IFS เริ่มต้นใน Awk คือแท็บและช่องว่าง

นี่คือแนวคิดของการแยกฟิลด์ใน Awk: เมื่อพบบรรทัดอินพุต ตาม IFS ที่กำหนด อักขระชุดแรกคือฟิลด์ที่หนึ่ง ซึ่งเข้าถึงได้โดยใช้ $1< อักขระชุดที่สองคือฟิลด์ที่สอง ซึ่งเข้าถึงได้โดยใช้ $2 อักขระชุดที่สามคือฟิลด์ที่สาม ซึ่งเข้าถึงได้โดยใช้ $3 และอื่น ๆ จนถึงอักขระชุดสุดท้าย

เพื่อให้เข้าใจการแก้ไขฟิลด์ Awk นี้ได้ดีขึ้น เรามาดูตัวอย่างด้านล่างนี้:

ตัวอย่างที่ 1: ฉันได้สร้างไฟล์ข้อความชื่อ tecmintinfo.txt

vi tecmintinfo.txt
cat tecmintinfo.txt

จากนั้นจากบรรทัดคำสั่ง ฉันพยายามพิมพ์ฟิลด์ แรก, วินาที และ ที่สาม จากไฟล์ tecmintinfo.txt โดยใช้คำสั่งด้านล่าง:

$ awk '//{print $1 $2 $3 }' tecmintinfo.txt

TecMint.comisthe

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

  1. ฟิลด์ที่หนึ่งซึ่งก็คือ “TecMint.com ” เข้าถึงได้โดยใช้ $1
  2. ฟิลด์ที่สองซึ่งก็คือ “is ” เข้าถึงได้โดยใช้ $2
  3. ฟิลด์ที่สามซึ่งก็คือ “the ” เข้าถึงได้โดยใช้ $3

หากคุณสังเกตเห็นในผลงานที่พิมพ์ออกมา ค่าของฟิลด์จะไม่ถูกแยกออกจากกัน และนี่คือลักษณะการทำงานของการพิมพ์ตามค่าเริ่มต้น

หากต้องการดูผลลัพธ์อย่างชัดเจนโดยมีช่องว่างระหว่างค่าของฟิลด์ คุณต้องเพิ่มตัวดำเนินการ (,) ดังนี้:

$ awk '//{print $1, $2, $3; }' tecmintinfo.txt

TecMint.com is the

สิ่งสำคัญสิ่งหนึ่งที่ควรทราบและจำไว้เสมอคือการใช้ ($) ใน Awk นั้นแตกต่างจากการใช้งานในเชลล์สคริปต์

ภายใต้เชลล์สคริปต์ ($) ใช้เพื่อเข้าถึงค่าของตัวแปรในขณะที่ Awk ($) จะใช้เฉพาะเมื่อเข้าถึงเนื้อหาของ ฟิลด์ แต่ไม่ใช่สำหรับการเข้าถึงค่าของตัวแปร

ตัวอย่างที่ 2: ลองมาดูอีกตัวอย่างหนึ่งโดยใช้ไฟล์ที่มีหลายบรรทัดที่เรียกว่า my_shoping.list

No	Item_Name		Unit_Price	Quantity	Price
1	Mouse			#20,000		   1		#20,000
2 	Monitor			#500,000	   1		#500,000
3	RAM_Chips		#150,000	   2		#300,000
4	Ethernet_Cables	        #30,000		   4		#120,000		

สมมติว่าคุณต้องการพิมพ์เฉพาะ Unit_Price ของแต่ละรายการในรายการช็อปปิ้ง คุณจะต้องเรียกใช้คำสั่งด้านล่าง:

$ awk '//{print $2, $3 }' my_shopping.txt 

Item_Name Unit_Price
Mouse #20,000
Monitor #500,000
RAM_Chips #150,000
Ethernet_Cables #30,000

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

การใช้ printf เพื่อจัดรูปแบบเอาต์พุตของ Item_Name และ Unit_Price:

$ awk '//{printf "%-10s %s\n",$2, $3 }' my_shopping.txt 

Item_Name  Unit_Price
Mouse      #20,000
Monitor    #500,000
RAM_Chips  #150,000
Ethernet_Cables #30,000

สรุป

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

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