[1.1] AWK OVERVIEW
Awk เป็น text-processing language ที่เป็นประโยชน์มาก ๆ ในการใช้งานต่าง ได้แก่
* การตรวจข้อมูลใน text file และสามารถสร้าง ไฟล์ ใหม่จากresult ที่ได้มา
* สามารถเพิ่ม function ต่างของ text editors ซึ่งเหมือนกับ vi
* สามารถแปลงไฟล์จาก format หนึ่ง ๆ ไปยัง format อื่น ๆ ได้
* สามารถสร้าง database ขนาดเล็ก ๆ ได้
* มีความสามารถในการคำนวณทางคณิตศาสตร์ได้
Awk มีสองหน้าที่ 1. สามารถทำงานใน simple text-processing tasks ได้
2. สามารถทำงานใน complex text-processing tasks. ได้เช่นกัน
[1.2] AWK COMMAND-LINE EXAMPLES (ตัวอย่าง ง่าย ๆ ในการเข้าใจ Awk)
เริ่มจากสร้างไฟล์ coins.txt ขึ้นมาโดยในไฟล์นี้มีข้อมูลดังนี้คือ
metal weight in ounces date minted country of origin description
ใส่ข้อมูลดังนี้ครับ
gold 1 1986 USA American Eagle
gold 1 1908 Austria-Hungary Franz Josef 100 Korona
silver 10 1981 USA ingot
gold 1 1984 Switzerland ingot
gold 1 1979 RSA Krugerrand
gold 0.5 1981 RSA Krugerrand
gold 0.1 1986 PRC Panda
silver 1 1986 USA Liberty dollar
gold 0.25 1986 USA Liberty 5-dollar piece
silver 0.5 1986 USA Liberty 50-cent piece
silver 1 1987 USA Constitution dollar
gold 0.25 1987 USA Constitution 5-dollar piece
gold 1 1988 Canada Maple Leaf
เมื่อทำการสร้างไฟล์แล้วให้ลองพิมพ์คำสั่งนี้
awk '/gold/' coins.txt
ผลลัพธิ์จะออกมามีหน้าตาเป็นแบบนี้ครับ
gold 1 1986 USA American Eagle
gold 1 1908 Austria-Hungary Franz Josef 100 Korona
gold 1 1984 Switzerland ingot
gold 1 1979 RSA Krugerrand
gold 0.5 1981 RSA Krugerrand
gold 0.1 1986 PRC Panda
gold 0.25 1986 USA Liberty 5-dollar piece
gold 0.25 1987 USA Constitution 5-dollar piece
gold 1 1988 Canada Maple Leaf
แต่ดังตัวอย่างแรก เราก็สามารถที่จะใช้คำสั่ง "grep" หรือ "find" บนlinuxได้เช่นกัน
ลองใช้คำสั่งนี้ดู
awk '/gold/ {print $5,$6,$7,$8}' coins.txt
ผลลัพธิ์ที่ได้เปลี่ยนไปจากเดิมครับ
American Eagle
Franz Josef 100 Korona
ingot
Krugerrand
Krugerrand
Panda
Liberty 5-dollar piece
Constitution 5-dollar piece
Maple Leaf
เหมือนเป็นการเพิ่มตัว condition เข้าไป
awk [search pattern] {[program actions]}
อย่างในส่วนนี้"{print $5,$6,$7,$8}" จะเป็นการแสดงผลออกมาใน field ที่ 5,6,7,8
ถ้ายังไม่เข้าใจให้ดูโครงสร้างนี้ครับ
สมมติให้ไฟล์ coins.txt มีโครงสร้าง(หรือเรียกว่า column ก็ได้)ดังนี้
metal weight in ounces date minted country of origin description
ถ้าแบ่งตามfields แล้วก็จะได้ field variable ตามนี้เลยครับ
metal: $1
weight: $2
date: $3
country: $4
description: $5 จนถึง $8
ลองใหม่
ถ้าพิมพ์คำสั่ง
awk '{if ($3 < 1980) print $3, " ",$5,$6,$7,$8}' coins.txt
ผลลัพธิ์จะแสดงออกมาดังนี้ครับ
1908 Franz Josef 100 Korona
1979 Krugerrand
สามารถที่จะสร้างเงื่อนไงในการตัดสินใจได้ "{if ($3 < 1980) print $3"
[1.3] AWK PROGRAM EXAMPLE มาดูส่วนในการเขียนโปรแกรมกัน
ยังคงใช้ไฟล์ coins.txt ไฟลเดิมอยู่ คำสั่งก็คล้าย ๆ เดิม
awk -f [awk program file name]
เราต้องการให้ output ที่แสดงออกมาเป็นหน้าตาเช่นนี้
Summary Data for Coin Collection:
Gold pieces: nn
Weight of gold pieces: nn.nn
Value of gold pieces: n,nnn.nn
Silver pieces: nn
Weight of silver pieces: nn.nn
Value of silver pieces: n,nnn.nn
Total number of pieces: nn
Value of collection: n,nnn.nn
โดยการสร้างไฟล์ที่มีชื่อว่า summary.awk เพิ่มมาโดยในไฟล์นั้นเขียนโปรแกรม Awk ลงไป
# This is an awk program that summarizes a coin collection.
#
/gold/ { num_gold++; wt_gold += $2 } # Get weight of gold.
/silver/ { num_silver++; wt_silver += $2 } # Get weight of silver.
END { val_gold = 485 * wt_gold; # Compute value of gold.
val_silver = 16 * wt_silver; # Compute value of silver.
total = val_gold + val_silver;
print "Summary data for coin collection:"; # Print results.
printf ("n");
printf (" Gold pieces: %2dn", num_gold);
printf (" Weight of gold pieces: %5.2fn", wt_gold);
printf (" Value of gold pieces: %7.2fn",val_gold);
printf ("n");
printf (" Silver pieces: %2dn", num_silver);
printf (" Weight of silver pieces: %5.2fn", wt_silver);
printf (" Value of silver pieces: %7.2fn",val_silver);
printf ("n");
printf (" Total number of pieces: %2dn", NR);
printf (" Value of collection: %7.2fn", total); }
เมื่อเขียนเสร็จแล้วทำการรันคำสั่งโดยใช้คำสั่งนี้
awk -f summary.awk coins.txt
เมื่อรันคำสั่งเสร็จแล้ว output ที่ได้จะมีหน้าตาเป็นแบบนี้ครับ
Summary data for coin collection:
Gold pieces: 9
Weight of gold pieces: 6.10
Value of gold pieces: 2958.50
Silver pieces: 4
Weight of silver pieces: 12.50
Value of silver pieces: 200.00
Total number of pieces: 13
Value of collection: 3158.50
ขอขอบคุณ:http://www.vectorsite.net/tsawk_1.html#m1