วิธีใช้ 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 ที่กำหนดซึ่งเป็นช่องว่าง:
- ฟิลด์ที่หนึ่งซึ่งก็คือ “TecMint.com ” เข้าถึงได้โดยใช้
$1
- ฟิลด์ที่สองซึ่งก็คือ “is ” เข้าถึงได้โดยใช้
$2
- ฟิลด์ที่สามซึ่งก็คือ “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 นั้นแตกต่างจากการใช้เชลล์สคริปต์
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับคุณ และสำหรับข้อมูลเพิ่มเติมหรือคำถามที่จำเป็น คุณสามารถโพสต์ความคิดเห็นในส่วนความคิดเห็นได้