Anda di halaman 1dari 78

AWK Tutorial Guide

¤¡ãs|pâ¤ß
ASPAC pº
Email: aspac@beta.wsl.sinica.edu.tw
ÞNøi : 94011
83 ~ 12 ë 5 é Version : 2.2
ASPAC pe©vn ú

ASPAC] Academia Sinica PACkage^O¤ ¡ã s |p â¤ ß ö ó \n éu ã Ï


Î " (Software Tools) Î \ÝD Ñ M " (Problem Solving) ºpeCbopeU Ò oi
§n éÎ åó £Ý ó ¤ ¡ãs |p â¤ ß Ò ³C Ò ³¿ ¡½ }§ ql Ρ ê Æ] ]A n
éÎåó^Ab¡¬UCnéÎåóÏÎvQ¡ ú UA£iKOúoÎÛÑÏÎC
néÎåóÏÎvQ¡ ú pUG
1. néºÏÎvQG
NuÎüê FSF] Free Software Foundation^ 1991~ 6ëÄG©º
GNU General Public LicenseC
2. åóºÏÎvQG
åóiHÛÑþ©ÎÞÎAý£oÇHÏQC£D²nâòOº¬úC
]@ëº PoorMan LaTEX¤LkÏΤåí¨¹ ` WÙ ,
Ò H»å¤ÈH^åÓíܹ ` WÙ .
Contents
1 Preface 2
2 Overview of AWK 3
2.1 Why AWK : : : : : : : : : : : : : : : : : : : : : : : : : : : : 3
2.2 How to get AWK : : : : : : : : : : : : : : : : : : : : : : : : : 3
2.3 How AWK works : : : : : : : : : : : : : : : : : : : : : : : : : 4
3 How to Compute and Print Certain Fields 9
4 Selection by Text Content and by Comparsion 11
5 Arrays in AWK 13
6 Making Shell Command in an AWK Program 17
7 A Pratical Example 19
7.1 Redirecting Output to Files : : : : : : : : : : : : : : : : : : : 21
7.2 Using System Resources : : : : : : : : : : : : : : : : : : : : : 23
7.3 Execute AWK Programs : : : : : : : : : : : : : : : : : : : : : 26
7.4 Changing Field Separator & User De ne Functions : : : : : : 29
7.5 Using getline to Input File : : : : : : : : : : : : : : : : : : : : 33
8 Multi-line Record 36
9 Getting Arguments on Command Line 39
10 Writing Interactive Program in AWK 41
11 Recursive Program 44
Appendix A Patterns 48
Appendix B Actions 52
Appendix C Built-in Functions 60
Appendix D Built-in Variables 64
Appendix E Regular Expression 67

1
1 Preface
 ³ö»âU :
oO@» AWKÇßüÞ , ä«IÛ« ó :
AWK A óÑ MþÇÝD ?
AWK `£º Ñ DÒ¡°ó ?

°ÏªÌÖtx¤ AWKÑ DºÒ¡ÎS Ê , »âUYÑ@Ç û ãNí Ê º d ÒÎä


D Ñ Ò c¨ ; U d ÒÑLJ` , ¼ ¹¡Û¬se , d Ò¤Ãï Ò Ïκ AWKykÎ
üO²H ²nº¡ ú . ³ö AWKºü O , çÆ ,...¥øC¡º¡ ú h¬ý ó þ ý¤
, HQª Ì ¹ á ¶g{ ¡Éd \ . p¹ s Æ , iýªÌ buÉ ¡º ¶Za Ç|Ï Î
AWKÓÑ MÝD . سªÌ`Û d ÒW÷êß , H[`ÇßÄG .

 ªÌ y ýãÆUCIº :
a. UNIX ôÒUº²æÞ@Îò»§ À .
Òp : É× s è , É× Æ s Î pipe, I/O Redirection ¥§ À
b. C y¥ºò»ykÎy{±îüO . 1
Òp :@ printf(), while()...

 ÑÒÑØ :
»âUO HÇßüÞ°D n s Æè¡ , ªÌYÝ n³ö AWK¶Ð Ô ÉºÑÒÑ ,i
ÑÒUCâ»Ñ :
{ Alfred V. Aho, Brian W. Kernighan and Peter J. Weinberger, \The
AWK Programming Language", Addison-Wesley Publishing Com-
pany
{ Dale Dougherty, \sed & awk ", O`Reilly & Associates, Inc

1 AWK üOãh , B䤧j¡ÀP C y¥¤§Îk@P , »âU¤ï Ó þüO§yk


ÎS Ê £A[Hc¾º¡ ú , ªÌYý`s ,iÛæ½\Ûöº C y¥Ñy
2
2 Overview of AWK
2.1 Why AWK
AWK O@Ø{¡y¥ . ¦ã³@ë{¡y¥`£º\à . ] AWKy¥ã³YÇ
SI , p : Ïν¶¹ (Interpreter)£Ýýæ s ¶ ; ÜÆL¬O§À (Typeless), iÏÎ
år í}CºùÐ (Associative Array)...¥Sâ . ]¹ , ÏÎ AWK¶g{¡ñ _ÏÎ
ä¦y¥ ó²äKQB ` ÙÉ¡ . AWKÙã³@ ǺØ\à , Ïo AWKÕ ó Bzã ê
ÆC (Record), æì (Field)¬Aº ê Æ ; ¹~ , AWKºØ³ pipeº\à , iNBz¤º
ê Æ Çe¹ ~¡º ShellR O[ HBz , AN ShellR O Bzá º ê Æ Ç^ AWK{¡ , o
ÓSI]Ïo AWK{¡Üe ö ÏÎtÎ ê ½ .
Ñ ó AWKã³ Wz S â , bÝD Bz º L{ , i´ ö Ï Î AWKÓ¶ g @Ç pu ã ;
oÇpuãÃDÎÓ Ñ MãÓjÝD , ¦ÌuÓOêt Ñ MÝDL{ºYǤâ , iÇÑ
ShellÒ £ Ѻ pipeN ê Æö Ýn Çe¹ £P ºpu ãi æBz , H Ñ M ãÓ jÝD . o
Ø Ñ Dè¡ , ÏooÇpuãi]£PÝDÓQ«ÐÕXÎÏÎ (reuse); ]iǹè¡Ó
ýæú Õ j{¡ì¬ºiæ Ê P¿ T Ê , NÓYÝn û ªºõæt×ÉAÎ Cy¥Óïg
. oO AWKÌ`Q³Î§B . Yà``p¹BzÝD , ªÌiHH󪺤×ÓäÒ â H
ºÝD , Ó£|Q ë d ó Ó ` º¡÷ . »âU° AWKJùºÇßüÞ , äºeNýj Õ p
ó¶g AWK{¡ , ¼CJi@B Ñ D衺³Îê Ò , o¡ ÀNdÝ UNIXi¥ âU¤
AæQ × .
2.2 How to get AWK
@ëº UNIX@~tÎ , »­Yþ³ AWK. £Pº UNIX@~tÎ Ò þº AWKä©»ç
£ÉÛP . YªÌ Ò ÏκtÎW¼þ³ AWK, izL anonymous ftp ìUCaèú
o:

phi.sinica.edu.tw:/pub/gnu
ftp.edu.tw:/UNIX/gnu
prep.ai.mit.edu:/pub/gnu

3
2.3 How AWK works
°K óÑ À AWK{¡[c , γöNy (terminology), ýH@Óûu~ ê É ( emp.dat
), Ó[H¶Ð .

A125 Jenny 100 210


A341 Dan 110 215
P158 Max 130 209
P148 John 125 220
A123 Linda 95 210
ÉפUæì̸° ûu ID, m W , ~ ê v ,Î êÚuÉ . ID¤ºÄ@ X
°¡ùÑO X . \A","P"ÀOíÜ \Õ Ë "Î \] Ë "¡ù .

»p ` Û« ó ¡ ú AWK{¡ºDn[cÎu@ìz , Ãï@Ç«nºWü²H²nº Ñ
À . Ño¡Àºe , ªÌié|X AWKy¥ºDnë«Î AWKPä¦ y{¡¥ºt§
B . °K ó ¡ ú , HøCè¡¡ úó á .

 Wü w q
1. ê ÆC (Record) : AWKq ê ÆÉWªú ê ƺò»æì .
HWCÉ× emp.dat °Ò , AWKªJº
Ä@§ ê ÆCO "A125 Jenny 100 210"
ÄG§ ê ÆCO "A341 Dan 110 215"
@ëÓ¥ , @§ ê ÆCÛí ó ê ÆÉWº@æ ê Æ .
(ÑÒ : þý B ºØÜÆ \RS" )

2. æì (Field) : ° ê ÆCWQÀj}ºlrê .
H ê ÆC \A125 Jenny 100 210"°Ò ,

Ä@æ ÄGæ ÄTæ Ä|æ


\A125" \Jenny" 100 210

@ëOHÅÕr¸ÓÀjÛFºæì . ( ÑÒ : þý D ºØÜÆ \FS" )

4
 póõæ AWK
ó UNIXº R OCWäJ Ñ pUC桺üO : ( \$"í ShellR OCWº£ÜÅ ¹ )

$ awk
'AWK{¡ ' ê ÆÉÉW
h AWK|ý s ¶ Ó {¡ , Máõæ Ó {¡ÓBz Ò ü w º ê ÆÉ .
(WCè¡Y½µâ{¡gb UNIXº R OCW )
 AWK{¡ºDn²c :
AWK{¡¤DnykO Pattern f Actions g, G`£§ AWK{¡ä¬Ap
U:
Pattern1 f Actions1 g
Pattern2 f Actions2 g
......
Pattern3 f Actions3 g

 Pattern O°ò ?
AWK iµü\h£P¬Aº Pattern. @ë`ÏÎ \öYP_¡ "(Relational
expression)  Pattern.
Òp :
x > 34 O@Ó Pattern, P_ÜÆ x P 34 O_sb j ó ºöY .
x == y O@Ó Pattern, P_ÜÆ x PÜÆ y O_sb ¥ ó ºöY .
W¡¤ x >34 , x == y KO嬺 Pattern.
AWK £Ñ C y¥ ¤ ` £ º ö Y B â ¸ (Relational Operators) p >, <,
>=, <=, ==, !=.
¹~ , AWK Ù£Ñ ~ (match) Î !~(not match) GÓöYB⸠(ù@ ). ä
ÎkP[ q pU :
Y A í@rê , B í@ Regular Expression
A ~ B P_ rê A ¤O_ ]t àX ó (match)B¡Ëºlrê .
A !~ B P_ rê A ¤O_ ¼]t àX ó (match)B¡Ëºlrê .
Òp :
\banana" ~ /an/ ãÓO@Ó Pattern.
]° \banana"¤ t³ i match /an/ºl r ê , G¹ö Y ¡
5
¨ß (true),
ãÓ PatternºÈ]O true.
ÛöÓ ` Ð ÑÒ þý A Patterns, þý E Regular Expression

ù @ : ³ÖÆ AWK× Û , â ~, !~ í¨t@þº Operator, ãø°@Ø Rela-


tional Operator. »âU¤NoâÓBâ¸í¨@Ø Relational Opera-
tor.
 Actions O°ò ?
Actions OÑ\h AWKüOc¨ . Ó AWKºüOP C y¥¤ºüOQÀþü .
Òp :
AWKº I/OüO : print, printf( ), getline..
AWKº y{±îüO : if(...)f..g elsef..g, while(...)f...g...
(Ð ÑÒ þý B | \Actions" )

 AWK póBz Pattern f Actions g ?


AWK |ýP_ (Evaluate) Ó Pattern §È , Y Pattern P_ (Evaluate)á
§È° true(Î £° 0ºÆr ,Î £Oźrê ), h AWK Nõæ Ó Pattern Ò ï
³º Actions.
ϧ , Y Pattern §È£° true, h AWKN£õæ Ó Pattern Ò ï³º Ac-
tions.
Òp : Y AWK{¡¤³UCâüO
50 > 23 f print "Hello! The word!!" g
"banana" ~ /123/ f print "Good morning !" g
AWK|ý P _ 50 >23 O_ ¨ ß . ]° Ó ¡ ¨ ß , Ò H AWKNL X
"Hello! The word!!". Ót @ Pattern ° "banana" ~/123/, ]°
"banana" º¼ t ³ô ól r êi match /123/, Ó Pattern §È°
false, G AWKN£|LX "Good morning !"

 AWK póBz f Actions g ºyk ? ( ÊÖ Pattern¡À )


³Éyk Pattern f Actions g¤ , Pattern ¡ÀQÙ¤ , uÑ fActionsg.
oØ¡ÎíÜ \LøóõæoÓ Actions".

 AWK ºæìÜÆ
6
AWK Ò ºØºæìÜÆÎä[NpU :
æìÜÆ [N
$0 °@rê , äºe°Øe AWK Ò ªJº ê ÆC .
$1 Ní $0 WÄ@Óæìº ê Æ .
$2 Ní $0 WÄGæÓìº ê Æ .
... älþÀ
ªJ ê ÆCÉ , AWKpó׿ (update)oǺغæìÜÆ
1. í AWK q ê Æɤªú@§ ê ÆCÉ , AWK |ÏκØÜÆ $0 ©HO
ý.
2. Cí $0 Q§ÊÉ (Òp : ªJsº ê ÆC Î ÛæÜó $0,...)
AWK |ßè«sÀR $0 ºæì¡p , ÃN $0 WUæìº ê ÆÎ $1, $2,
..©HOý .

 AWKººØÜÆ (Built-in Variables)


AWK £ÑF\hºØÜÆ , ÏÎÌ ó {¡¤iÏÎoÇÜÆÓúoÛö ê T .
`£ººØÜƳ :
ºØÜÆ [N
NF (Number of Fields)°@ãÆ , äÈí $0W Ò sbºæìÆØ .
NR (Number of Records)°@ãÆ , äÈí AWKwªJº ê ÆCÆØ .
FILENAME AWK¿bBzº ê ÆÉÉW .
Òp : AWK q ê ÆÉ emp.dat ¤ªJÄ@§ ê ÆC
"A125 Jenny 100 210" §á , {¡¤ :
$0 §ÈNO "A125 Jenny 100 210"
$1 §È° "A125" $2 §È° "Jenny"
$3 §È° 100 $4 §È° 210
NF §È° 4 $NF §È° 210
NR §È° 1 FILENAME §È° \emp.dat"

 AWKºu@y{ :
õæ AWKÉ , ¦|Ï Æ iæUC|BJ .
1. ÛÊqü w º ê Æɤªú@§ ê ÆC .
2. ÛÊós (Update)ÛöººØÜÆ§È . p : NF, NR, $0...
3. v¸õæ{¡¤ Ò ³ º Pattern f Actions g üO .
7
4. íõæ¹{¡¤ Ò ³ Pattern f Actions g É , Y ê Æɤٳ¼ªúº
ê Æ , hÏÐõæBJ 1ìBJ 4.
AWK|ÛÊ«ÐiæWz 4ÓBJ , ÏÎÌ£· ó {¡¤¶goÓjé (Loop).

8
3 How to Compute and Print Certain Fields
AWK Bz ê ÆÉ , ¦|ÛÊq ê Æɤ@¸ªú@§Oý , Ã|N Ó ê ÆÁÀ¨
@ÓÓºæì ; {¡¤iÏÎ $1, $2,... ½µúoUÓæ캺e . oÓSâýÏÎÌ ö
ó Î AWK ¶g reformatter ÓïÜ ê Ææ¡ .

dÒ : HÉ× emp.dat °Ò , pâCH³ou ê ÃCLøí .


ÀR : AWK |Ûæ@¸ªJ@C ê Æ , G{¡¤ÈÝiD AWK póBz Ò ªJº ê Æ
C.
õæpU R O : ( $ í UNIXR OCWº£ÜÅ ¹ )
$ awk 'f print $2, $3 * $4 g' emp.dat
õæ²GpU :
ÃõX{ :
Jenny 21000
Dan 23650
Max 27170
John 27500
Linda 19950
¡ú:
1. UNIXROCW , õæ AWKºyk° :
$ awk 'AWK{¡ ' ýBzº ê ÆÉÉW .
» d Ò¤º {¡¡À ° f print $2, $3 * $4 g . â{¡ m óR OCÉ , {¡
§eá·H ' Aí .
2. emp.dat °ü w ¹ Ó {¡Bzº ê ÆÉÉW .
3. »{¡¤ÏÎ : Pattern f Actions g yk .
Pattern Actions
print $2, $3 * $4
Pattern ¡ÀQÙ¤ , íLôó­îøó . G AWKªJC§ ê ÆCá£NLøó
õæoÓ Actions.

9
4. print ° AWKÒ £Ñº éXüO , |N ê ÆéX ì stdout(Ãõ ). print ºÑ
Æ¡ ¼ ¹H \," j} , LX ê ÆÉ ¼ ¹¡|HÅÕj} .
(ÑÒ þý D ºØÜÆ OFS)

5. NWzº {¡¡À xs ó É× pay1.awk ¤ . õæ R OÉAü w AWK {¡É


§ÉW . oOõæ AWKºt@Øè¡ , SOAÎ ó {¡ û jº¡p , äykpU :
$ awk -f AWK{¡ÉW ê ÆÉÉW
GõæUCâ R O ,N£ÍP˺²G .
$ awk -f pay1.awk emp.dat
$ awk ' f print $2, $3 * $4 g ' emp.dat
ªÌiÏÎ \-f"ÑÆ ,ý AWKD{¡ÏÎä¦Èt AWKçÆ ºÉפºçÆ
äykpU :
$ awk -f AWKD{¡ÉW -f AWKçÆÉW ê ÆÉÉW
(³ö AWK ¤çƧÅiPÏÎ ó 7.4 ¤¡ ú )
6. AWK¤]£ÑP C y¥¤þüÎkº printf() çÆ . ÏÎ Ó çÆii@B±î
ê ƺéXæ¡ .

s èt@Ó AWK{¡pU , ÃúW° pay2.awk


f printf("%6s Work hours: %3d Pay: %5dnn", $2, $3, $3*$4) g

õæUC R O
$ awk -f pay2.awk emp.dat
õæ²GÃõX{ :
Jenny Work hours: 100 Pay: 21000
Dan Work hours: 110 Pay: 23650
Max Work hours: 130 Pay: 27170
John Work hours: 125 Pay: 27500
Linda Work hours: 95 Pay: 19950

10
4 Selection by Text Content and by Comparsion
Pattern f Action g ° AWK¤ÌDnºyk . YY Pattern§È°uhõ
æ¦á è º Action. AWK¤` Ï Î \ö YP _ ¡ "(Relational Expression)Óí
¨ Pattern.
AWK¤£F >, <, ==, != ,... ¥öY B⸠( Relational Operators )~
, t~£Ñ ~ (match), !~ (Not Match) GÓöYB⸠. QÎoâÓB⸠, iP
_YrêO_]tàÅX Ò ü w Regular Expression ºlrê .
Ñ ó oÇS Ê , Üe ö ÏÎ AWKÓ¶gÝnrêñï , P_º{¡ .

d Ò : Ó WÒ ,
1. Õ Ë ¡ùûu Õ ~ 5%,(Õ Ë ¡ùûu§ ID.YH \A"}Y )
2. Ò ³ûuÌá§~ ê vY´C ó 100, hH 100p .
3. ¶g AWK{¡CLsºûu~ ê vøí .
ÀR :
oÓ {¡· ýP _ Ò ª Jº ê ÆC O_ X ó ü w ø ó , Ai æY ÇÊ@ . AWK¤
Pattern f Actions g ºykw[\oØ \if ( øó ) f Ê@ g "º [c .

s gpU§{¡ , ÃúW adjust1.awk


$1 ~ /^A.*/ f $3 *= 1.05 g
$3 < 100 f $3 = 100 g
f printf("%s %8s %dnn", $1, $2, $3) g
õæUC R O :

$ awk -f adjust1.awk emp.dat


²GpU :
ÃõX{ :
A125 Jenny 105
A341 Dan 115
P158 Max 130
P148 John 125
A123 Linda 100

11
¡ú:

1. AWKºu@{ÇO :
q ê ÆɤC¸ªJ@§ ê ÆC , ÌÇõæ¹{¡¤ Ò ³º Patternf Action güO
Pattern Actions
$1 ~ /^A.*/ f $3 *= 1.05 g
$3 < 100 f $3 = 100 g
f printf("%s %8s %dnn",$1,$2,$3) g

Aq ê ÆɤªiU@§Oý~òiæBz .

2. Ä@Ó Pattern f Action gO :


$1 ~ /^A.*/ f $3 *= 1.05 g
$1 ~ /^A.*/ O@Ó Pattern, ÎÓP_ Ó § ê ÆCºÄ@æO_]tH \A"}Y
ºlrê . ä¤ /^A.*/ O@Ó Regular Expression, ÎHíÜôóH \A"}Yº
rê . (³ö Regular Expression §Îk ÑÒ þý E ).
Actions ¡À° $3 *= 1.05 . $3 *= 1.05 P $3 = $3 * 1.05 N q ÛP . Bâ
l \*=" §ÎkhP C y¥¤@Ë . ¹áP C y¥¤ÎkÛPºBâl Î ykN
£©Øz .

3. ÄGÓ Pattern f Actions g O :


$3 <100 f $3 = 100 g
YÄTæº ê ƺe (í~ ê v )p ó 100, h Õ ã° 100.

4. ÄTÓ Pattern f Actions g O :


f printf("%s %-8s %dnn",$1, $2, $3 ) g
Ù¤F Pattern(Løóõæ Actions), G Ò ³ ê ÆC Õ ãẠê Æ£NQLX .

12
5 Arrays in AWK
AWK{¡¤¹\ÏÎrêíµ}CºùÐ (index). QÎoÓSâQÀ³U ó ê ÆÎ
pu@ . (ÏÎrêíùк}CÙ° Associative Array)
ºýØß@Ó ê ÆÉ , ÃúW° reg.dat. ¹°@ÇÍùUº ê ÆÉ ; Ä@æ°ÇÍ m W
, äá° Ó Í Ò × Ò { .
Mary O.S. Arch. Discrete
Steve D.S. Algorithm Arch.
Wang Discrete Graphics O.S.
Lisa Graphics A.I.
Lily Discrete Algorithm

AWK¤}CºS Ê
1. ÏÎrêí}CºùÐ (index).
2. ÏÎ}Ce£·Åi}CWÙÎäjp .
Òp : ÆæÎ}CÓOý reg.dat ¤Uù Ò {º× Ò HÆ .
o¡p ,³Gµ ê T²·xs :
(a) Ò {WÙ , p : \O.S.",\Arch.".. ,@³þÇ Ò {Æeã ú T .
(b) U Ò {º× Ò HÆ . p : ³XÓH× \O.S."
b AWK¤unÎ@Ó}CNiPÉOýWC ê T . äèkpU :
ÏÎ@Ó}C Number [ ] :
* H Ò {WÙí Number[ ] ºùÐ .
* H Number[ ] ¤£PùÐ Ò ïMº¸ÀNí× Ò HÆ .
Òp :
³ 2ÓÇÍ× \O.S.", hH Number[\O.S."] = 2 í§ .
Y× \O.S."ºHÆW[@H ,
h Number[\O.S."] = Number[\O.S."] + 1
Î Number["O.S."]++ .

3. póúX}C¤xsº ê T
H C y¥°Ò , Åi int Arr[100]; §á , YQo¾ Arr[ ]¤ Ò xsº ê Æ , u
13
·Î@Ójé , p :
for(i=0; i<00; i++) printf("%dnn", Arr[i]);
Yi . W¡¤ :
}C Arr[ ] ºùÐ : 0, 1, 2,..., 99
}C Arr[ ] ¤UùÐ Ò ï³ºÈ : Arr[0], Arr[1],...Arr[99]
ý AWK ¤ÏÎ}Cã·ÆýÅi . Hè~Ïκ Number[ ] Ó¥ , {¡õæ
e , ã¾NÓ³þÇ Ò {WÙiàQí¨ Number[ ] ºùÐ .
AWK £ÑF@ÓüO , ÇÑ Ó üO AWK|ÛÊäM}C¤ÏÎLº Ò ³ùÐ . H
Number[ ] °Ò , AWKN|äì \O.S.", \Arch."",...
ÏÎ Ó üOÉ , ·ü w Ò näMº}C , Î@ÓÜÆ . AWK|ÏÎ Ó ºÜÆÓOý
q}C¤äìºC@ÓùÐ . Òp
for( course in Number ) f....g
ü w Î course ÓOý AWK q Number[ ] ¤ Ò äìºùÐ . AWKCäì@Ó
ùÐÉ , NÎ course Oý Ó ùЧÈBõæ f....g¤§üO . ÇÑoÓè¡Kiú
X}C¤xsº ê T .(Ô £UÒ )

dÒ :ÎpUì× Ò HÆ ,ÃLX²G .
ØßpU{¡ ,ÃúW° course.awk :
f for( i=2; i<NF; i++) Number[$i]++ g
END f for( course in Number)
printf("%-10s %dnn", course, Number[course] )
g

õæUC R O :
$ awk -f course.awk reg.dat
õæ²GpU :
Discrete 3
D.S. 1
O.S. 2
Graphics 2

14
A.I. 1
Arch. 2
Algorithm 2

¡ú:

1. o{¡]tGÓ Pattern f Actions güO .


Pattern Actions
f for( i=2; i<NF; i++) Number[$i]++ g
END f for( course in Number) printf("%-10s %dnn",
course, Number[course] ) g

2. Ä@Ó Pattern f Actions güO¤Ù¤F Pattern ¡À . GHÛC§ ê ÆCºª


Jä Actions¡ÀNv¸LøóQõæ .
H AWKªJÄ@§ ê Æ \Mary O.S. Arch. Discrete" °Ò ,
]° Ó § ê Æ NF = 4(³ 4Óæì ), G Ó Action º for Loop¤ i = 2,3,4.
i $i Ìì Number[$i] Number[$i]++ §á
2 \O.S." AWK default Number[\O.S"]=0 1
3 \Arch." AWK default Number[\Arch"]=0 1
4 \Discrete" AWK default Number[\Discrete"]=0 1

3. ÄGÓ Pattern f Actions güO¤


* END° AWK§Odr , ° Pattern§@Ø .
* END¨ß (äÈ° true)ºøóO :
\AWKBz¹ Ò ³ ê Æ , YN÷}{¡É ."
­`ªJ ê ÆCÉ , ENDã¨ß , GäẠActionsãQõæ ; ß³í AWKª
¹ Ò ³ ê ÆÉ , Ó Actions~|Qõæ ( `N ,£Þ ê ÆC³hÖ§ , ENDÈbÌá
~¨ß , G Ó ActionsÈQõæ@¸ .)
BEGIN P END ³Iþü , O AWK¤t@ÓOdº Pattern.
ß@£PºO :
\H BEGIN ° Pattern º Actions ó {¡@} l õæÉ , Qõæ@¸ ."
4. NF ° AWKººØÜÆ , ÎHíÜ AWK¿Bzº ê ÆpC¤ , Ò ]tºæìÓÆ .

15
5. AWK{¡¤Yt³H $ }YºÛ w ÜÆ , £NHpUè¡ Ñ À :
H i = 2 °Ò , $i = $2 íÄGÓæì ê Æ .
( êÚW , $ b AWK ¤°@B⸠(Operator), ÎHúoæì ê Æ .)

16
6 Making Shell Command in an AWK Program
AWK{¡¤¹\ I s ShellüO . Ã£Ñ pipeÑ M AWKPtΡ ê ÆǼºÝD
. Ò H AWKÜe ö ÏÎtÎ ê ½ . ªÌiQÎoÓSâÓ¶gYÇAκtÎuã .
dÒ : g@ AWK{¡ÓCLX u WHÆ .
NUC{¡ØÉ , R W° count.awk

BEGIN f
while ( "who" | getline ) n++
print n
g

ÃõæUC R O :
$ awk -f
count.awk
õæ²GN|LXØe u WHÆ
¡ú:
1. AWK {¡Ã£@ w nBz ê ÆÉ . H»ÒÓ¥ , ÈéJ{¡É count.awk , ¼é
Jôó ê ÆÉ .
2. BEGIN M END P° AWK¤§Ø@ Pattern. H BEGIN ° Pattern§ Actions,u³
b AWK} l õæ{¡ ,| ¼}ÒôóéJÉe , Qõæ@¸ .(`N : uQõæ@¸ )
3. \|" ° AWK ¤íÜ pipeºÅ ¹ . AWK â pipe§eºrê "who"í¨ ShellW
º R O , ÃN ÓR Oe ¹ Shellõæ , õ溲G (ìý³ ó ÃõLXÌ )hÇÑ pipee
i AWK{¡¤ .
4. getline ° AWKÒ £ÑºéJüO .
äykpU :
yk ÑóBªú ê Æ ê ƪJá m ó
getline var< le Ò ü w º le ÜÆ var(varÙ¤É ,íÜ m ó $0)
| getline var pipe ÜÆ var(varÙ¤É ,íÜ m ó $0)
getline var £ ù@ ÜÆ var(varÙ¤É ,íÜ m ó $0)
ù@ : í Pattern ° BEGIN Î END É , getline NÑ stdin ªú ê Æ , _h
Ñ AWK¿Bzº ê ÆÉWªú ê Æ .

17
getline @¸ªú@æ ê Æ ,
Yªú¨\h return 1,
Yªú¢Ñh return -1,
YJìÉײô (EOF), h return 0;
»{¡ÏÎ getline Ò return º ê Æ Óµ° while P_jé±îºøó .
YÇ AWK©» û  ,ãe\ÏÎÌïÜ $0 §È . oØ©º AWK õæ»{¡É
|£Í Error, ªÌi ó getline §á m W@ÓÜÆ (p¹ , getline ªiÓº ê ÆK
£|Q mó $0 ), Î ½µïÎ gawkKi Ñ M .

18
7 A Pratical Example
» ` NÜ d @ÓÎpWZìFÉ¡Îðì¸Æº{¡ .

o{¡CéQõæÉNªJGÓÉ× :
ûuíéìZÉ¡º ê ÆÉ ( pUC§ arr.dat )
s ñ ûuíëðìÖp¸ÆºÉ× .
í{¡õæõ¹¦áNósÄGÓÉ׺ ê Æ (ðì¸Æ ), ÃCLíéºøí . o{¡
NÀ¨UCÆp ` vB¹¨ , äjõpU :

7.1 ó ìZ ê ÆÉ arr.dat §eÝW[@C ï Y "ID Number Arrvial Time"


, ãÍøíéXìÉ× today rpt1 ¤ "
< b AWK¤póN ê ÆéXìÉ× >

7.2 N today rpt1 W§ ê ÆöûuN ¹ ÆÇ , Ã[ùõæíé§éÁ ; £ÍÉ× to-


day rpt2
< AWK¤póBÎtÎ ê ½Î AWK¤ Pipe§S Ê >

7.3 < N AWK{¡]tb@Ó shell scriptÉפ >

7.4 ó today rpt2 CéøíW , ðì̧e[W "*", Ã[ùíé­¡ìZÉ¡ ; £Í


É× today rpt3
<AWK¤póïÜæìÁÎè¡ , wq çÆ , ÎçÆ I s >

7.5 qÉפªúíëðì¸Æ , ÃÚÚíéXÔ¬pósðìÖpÆ .


< ÏÎÌ ó AWK¤póªúÉ× ê Æ >

Y½qäûuìÔÉ¡ÉpU , úW° arr.dat . ÉפÄ@æ°ûuN ¹ , ÄGæ°


ìFÉ¡ . » d Ò¤ , NÏÎ Ó É×° ê ÆÉ .

1034 7:26
1025 7:27

19
1101 7:32
1006 7:45
1012 7:46
1028 7:49
1051 7:51
1029 7:57
1042 7:59
1008 8:01
1052 8:05
1005 8:12

20
7.1 Redirecting Output to Files
AWK¤Ã¼£Ñp C y¥¤§ fopen() üO , ]¼³ fprintf() É×éX§ü
O . ý AWK¤ôóéXçƧáÒiÇÑÏÎP UNIX ¤þüº I/O Redirection
, NéXº ê Æ Redirect ìü w ºÉ× ; äÅ ¹ ´° > (éXì@Ós£ÍºÉ× ) Î
>> ( append éXº ê ÆìÉ×½Ý ).

Ò : ó ìZ ê ÆÉ arr.dat §eÝW[@C ï YpU : "ID Number Arrival Time"


, ãÍøíéXìÉ× today rpt1 ¤

ØßpUÉ×ÃúW° reformat1.awk
BEGIN f print \ ID Number Arrival Time" > \today rpt1"
print \==========================="> \today rpt1"
g

f printf(" %s %snn", $1,$2 ) > "today rpt1" g


õæ :

$ awk -f reformat1.awk arr.dat

õæáN£ÍÉ× today rpt1 , äºepU :


ID Number Arrival Time
============================
1034 7:26
1025 7:27
1101 7:32
1006 7:45
1012 7:46
1028 7:49
1051 7:51
1029 7:57
1042 7:59
1008 8:01
1052 8:05
1005 8:12

21
¡ú:
1. AWK{¡¤ , É×WÙ today rpt1 §eá·H "
Aí , íÜ today rpt1 °@
"
rê`Æ . Y¼H Aí , h today rpt1 NQ AWKÑ À°@ÓÜÆWÙ .
b AWK¤ôóÜÆÏΧe , ã·ÆýÅi . äì l È°Årê (Null string) Î 0.
]¹{¡¤Y¼H " N today rpt1 Aí , h today rpt1 NO@ÜÆ , äÈNO
Årê , o| ó õæÉy¨ù~ (Unix Lk°z}Ò@ÓH Null String°ÉWºÉ× ).
* ]¹b s è AWK{¡É , ·æ~dß . ]°YVùÜÆWÙ , AWKb s ¶{¡É
|{°O@sºÜÆ , ã|î± . p¹ ¹¹ |y¨ Runtime Error.
2. BEGIN ° AWKºOdr , O Pattern º@Ø .
H BEGIN ° Pattern º Actions óAWK{¡èQõæ | ¼ªú ê ÆÉQõæ@¸
, ¹áK£AQõæ .

3. ªÌ Î \±o»{¡¤º I/O RedirectionÅ ¹ ³ÏÎ \>>" (append) ÓD \>".


* »{¡ ¤Y Ï Î \>" N ê Æ «É ì today rpt1 , AWKÄ@¸ õæ Ó üO É
|£ Í @ Ó s É today rpt1 , äá A õ æ Ó ü O É h â ê Æ appendì to-
day rpt1 ɽ , ÃDCõæ@¸N«}@ÓsÉ .
* YÄÎ ">>"ät§ Èb Ä@¸ õæ Ó ü OÉ , Yws b today rpt1 h AWK
N½µâ ê Æ appendbìÉק½À .
* o@I , P UNIX¤ºÎk£P .

22
7.2 Using System Resources
AWK {¡¤Üe ö ÏÎtÎ ê ½ . o]A ó {¡¤~sÎ Shell R OÓBz{¡
¤º¡À ê Æ ; ÎóI s Shell R OáNä£Í§²Gæ^ AWK {¡ (£ÝN²GÈs
ó YÓÉ× ). oL{DOÇÑ AWK Ò £Ñº pipe (öM³Çþü Unix ¤º pipe,
ýS Ê ³Ç£P ), Î@Óq AWK ¤ I s Unix º Shell command ºykÓF¨ .

Ò : Ó WD , N ê Æöûu IDÆÇáAé XìÉ× today rpt2 , à ó íYþ[õæÉ


ºéÁ .

ÀR:
1. AWK £ÑP UNIX Îk ñüº pipe, äO ¹ ç° \|". äÎkÎ[Np U :
AWK{¡¤iµüUCâyk :
a. yk AWK output üO | \Shell µüº R O "
( p : print $1, $2 | "sort +1n" )
b. yk \Shell µüº R O " | AWK input üO
( p : "ls " | getline )
ù : AWK input üOu³ getline @Ó .
AWK output üO³ print, printf() GÓ .
2. ó a yk¤ , AWKÒéXº ê ÆNàe ¹ Shell, Ñ Shell º R OiæBz .
HWÒÓ¥ , print Ò LXº ê ÆN g Ñ Shell R O \sort +1n" ÆÇáAe ¹ Ã
õ (stdout).
WC AWK{¡¤ , \print $1, $2" iàÏÐõæÜh¸ , äLXº²GNýÈs ó
pipe ¤ , ¥ì Ó {¡²ôÉ , ~|@Öiæ \sort +1n".
·`NGI : £ × print $1, $2 QõæX¸ ,
\sort +1n" § õæÉ¡O \AWK{¡²ôÉ ",
\sort +1n" § õæ¸ÆO \@¸ ".

3. ó b yk¤ , AWKNýsÎ Shell R O . äõæ²GN g Ñ pipe eJ AWK{¡


HWÒÓ¥ , AWKýO Shell õæ \ls", Shell õæáN²Gs ó pipe, AWKü
O getline Aq pipe ¤ªú ê Æ .
Ïλykɳdß : HWÒÓ¥
23
AWK \ßè "I s Shell Óõæ \ls", õæ¸ÆO@¸ .
getline hiàõæh¸ (Y pipe¤sbhæ ê Æ ).

4. £WC a, b Gyk~ , AWK{¡¤¦BYX{³ "date", "cls", "ls"... ¥rê ,


AWKuí¨@ërêBz§ .

ØßpUÉ×ÃúW° reformat2.awk
# {¡ reformat2.awk
# o{¡ÎH m ß AWK¤º pipe
BEGIN f
"date" | getline # Shell õæ \date". getline úo²GÃ H $0Oý
print " Today is " , $2, $3 > "today rpt2"
print "=========================" > "today rpt2"
print \ ID Number Arrival Time" > \today rpt2"
close( "today rpt2" )
g

f printf( " %s %snn", $1 ,$2 )| "sort +2n >> today rpt2" g

õæpU R O :
$ awk -f reformat2.awk arr.dat

õæ á , tÎ | Û Ê N sort Ạê Æ [ ( Append; ]° Ï Î \>>") ìÉ × to-


day rpt2 ½Ý . today rpt2 ºepU :

Today is Sep 17
=========================
ID Number Arrival Time
1005 8:12
1006 7:45
1008 8:01
1012 7:46
1025 7:27
1028 7:49
1029 7:57
1034 7:26
1042 7:59
1051 7:51

24
1052 8:05
1101 7:32

¡ú:
1. AWK{¡ÑTÓDn¡Àc¨ :
i. Pattern f Action g üO
ii. çÆDé . Òp : function double( x )f return 2*x g (ÑÒÄ 11` Re-
cursive Program )
iii. Comment ( H # }YÑO§ )
2. AWK ºéJüO getline, C¸ªú@C ê Æ . Y getline§á¼µôóÜÆ , h Ò
ªJ§ ê ÆNH $0 öý , _hH Ò ü w ºÜÆxs§ .
H»ÒÓ¥ :
õæ "date" | getline á ,
$0 §È° "Wed Aug 17 11:04:44 EAT 1994"
í $0 §ÈQósÉ , AWKNÛÊósÛöººØÜÆ , p : $1,$2,..,NF.
G $2 §ÈN° "Aug", $3§ÈN° "17".
(³ÖÆ©§ AWK£¹\YÏÎÌÛæós (update)$0§È ,Î Ì update$0É ,
¦£|ÛÊós $1,$2,..NF. o¡pU , iïÎ gawk,Î nawk. _hÏÎÌ]i
ÛæH AWKrêçÆ split()ÓÀj $0Wº ê Æ )
3. »{¡¤ printf() üO|Qõæ 12¸ ( ]°³ arr.dat ¤³ 12§ ê Æ ), ýªÌ£Î
áß ê ÆQ« Æ sortF 12¸ . í AWK²ô Ó {¡É~| close oÓ pipe , ¹É~
No 12§ ê Æ@¸e ¹ tÎ , Ã I s "sort +2n >> today rpt2" Bz§ .
4. AWK£Ñt@ÓsÎ ShellR Oºèk , YÏÎ AWKçÆ
system("shellRO ")
Òp :
awk '
BEGINf
system("date > date.dat")
getline < date.dat
print "Today is ", $2, $3
g
'
ýÏ Î system( "shell R O " ) É , AWKLk ½µ N õæ ¤º ¡ À ê Æé X ¹
Shell R O . B Shell R Oõ溲G]Lk½µéJì AWK¤ .

25
7.3 Execute AWK Programs
»p ` ¤ y z p ó N AWK{ ¡ ½ µ g b shell script §¤ . ¹á Ï Î Ì õ æ
AWK {¡É , N£Ý nC ¸£ äJ \awk -f program data le ". script ¤Ù
i]tä¦ Shell R O , p¹óiW[õæL{ºÛÊÆ .
Øß@Ó²æº AWK{¡ mydump.awk , pU :
f print g

oÓ{¡õæÉ|â ê Æɺºe print ìÃõW ( P cat\Îþü ).


print §á¼µôóÑÆÉ , íÜ \print $0".
Yý õ æ Ó AWK{¡ , ÓL X É × today rpt1 Î today rpt2 ºº e É , ²· ó
UNIX º R OCWõæUC R O :

è¡@ $ awk -f mydump.awk today rpt1 today rpt2

è¡G $ awk 'f print g' today rpt1 today rpt2


ÄGØè¡YN AWK{¡½µgb Shell º R OCW , oØè¡ÈAX û u
º AWK{¡ .

è¡T ØßpU§ shell script, ÃúW° mydisplay ,


awk ' # `N , awk P ' §¡·³ÅÕj}
f print g
' $* # `N , ' P $* §¡·³ÅÕj}
õæ mydisplay §e , ·ýN¦ï ¨iõæº É× (¹B J ¹ á£A Øz ).
Ð õæpU R O :
$ chmod +x mydisplay
¹ áÏÎÌNi½µâ mydisplay í¨üO , Ó displayôóÉ× .
Òp :
$ mydisplay today rpt1 today rpt2

26
¡ú:
1. b scriptÉ× mydisplay ¤ , üO \awk"PÄ@Ó ' §¡·³Åæ (Shell¤ÃL \
awk' "üO ).
Ä@Ó ' ÎHq¾ Shell äá° AWK{¡ .
ÄGÓ ' híÜ AWK {¡²ô .
G AWK{¡¤@ßH "Aírê Î r¸ , Ó£ÏÎ ' , HK ShellVc .

2. $* ° shell script¤§Îk , ¦iÎHNí R OCW \mydisplay §áº Ò ³ÑÆ


".
Òpõæ :
$ mydisplay today rpt1 today rpt2
ÆêW Shell wýâ Ó üO૨ :
awk '
{ print }
' today_rpt1 today_rpt2

»Ò¤ , $* ÎHNí \today rpt1 today rpt2". b Shellºyk¤ , iÎ $1 Ní


Ä@ÓÑÆ , $2 NíÄGÓÑÆ . í£ Tw R OCWºÑÆÓÆÉ , iÏÎ $* í§ .

3. AWKROCWiPÉü w hÓ ê ÆÉ .
H $ awk -f dump.awk today rpt1 today rpt2 °Ò
AWK|ýBz today rpt1, ABz today rpt2. ¹ÉYÉ×Lk}Ò , Ny¨
ù~ .
Òp : ¼sbÉ× " le no exist", hõæ :
$ awk -f dump.awk le no exit
N£Í Runtime Error(Lk}ÒÉ× ).
ýYÇ AWK{¡ \È " ]tH BEGIN ° PatternºüO . õæoØ AWK{¡É
, AWKã·}Òôó ê ÆÉ .
¹É R OC WY ü w @ Ó£ sbº ê Æ É ,ã| £Í \Lk}Ò É× "ºù ~ .(Æ
êW AWKü}Ò Ó Éö )
Òpõæ :
$ awk 'BEGIN f print "Hello,World!!" g' le no exist
Ó {¡¤È]tH BEGIN ° Pattern § Pattern factionsg, AWKõæÉÃ
£|}Òôó ê ÆÉ ; G£|]£sbÉ× le no exit Ó£Í \Lk}ÒÉ× "º
27
ù~ .

4. AWK|N Shell R OCW AWK{¡ (Î -f {¡ÉW )§áº Ò ³rê , ø°Né


J AWKiæBzº ê ÆÉÉW .
Yõæ AWKº R OCW \¼ü w ôó ê ÆÉÉW ", hN stdinø°éJ§ ê ÆÓ½
, ½ìéJ end of le( Ctrl-D )°î .
ªÌiHUC{¡Ûæú Õ , õæpU R O :
$ awk -f dump.awk (¼µôó ê ÆÉÉW )
Î
$ mydisplay (¼µôó ê ÆÉÉW )
N|o{ : ¹áäJº ôó ê ÆNvæ Æ L@÷ ó ÃõW . o¡p£O÷¹ í÷ !
O]° AWK{¡¿B ó õæ¤ . ¦¿ö{¡üÜ ,Nªú ê Æës dump@¸ ; u
]õæɼü w ê ÆÉÉW , G AWKKH stdin(ä L WºéJ )° ê ÆÓ½ .
ªÌiQÎoÓSI , ]piP AWK{¡ interactive talkº{¡ .

28
7.4 Changing Field Separator & User De ne Functions
AWK£ÈàÛÊÀÎæì , ]¹\ ÏÎÌïÜäæì ÁÎè¡HA³U Ø桧
Ýn . ÏÎÌ]iÛ w çÆ , Y³ÝniN Ó çÆæWg¨@ÓÉ× ,HÑä¦ AWK{¡
sÎ .

d Ò : Ó µ 6.2 ºÒl , YKI°WZÉ¡ , Ð [ù \*"ó ðìOý§e , Ãpâ­¡WZ


É¡ .

À R:
1. ]KIãì FÌ ,£° ðì , GÈH ìFºpÉƵP_ O£÷º ; ´³Ñ ÒìFÉ
ºÀÁÆ . Y \NìFɡ૨HÀÁ°æì ",£È ö ó P_O_ðì , PÉ] ö
ó pâìF­¡É¡ .
2. ìFÉ¡ ($2)º æ¡° dd:dd Î d:dd; Ærí¤t³@Ó ":". ýåÆræøº
ê Æ AWKLk½µµÆÇBâ . (ù : AWK¤rê "26"PÆr 26, ÃLt§ , i½
µµrê Î ÆÇBâ , oO AWK«nSâ§@ . ý AWKïåÆræøºrêLk
¿ T iæÆÇBâ ).
Ñ M§èk :
èk@ . ïìFÉ¡ ($2) d:dd Î dd:dd iær êBâ ,ÀOúXìFºpÉÆ ÎÀ
ÁÆ .
ºýP_ìFpÉÆ°@ì Î âìr¸ ,A I sçÆÀOIúÀÁÆÎpÉÆ .
¹ Ñ kÝÏÎUC AWKrêçÆ :
length( rê ) : Ç^ Ó rê§ø× .
substr( rê ,_ l ì m ,ø× ) : Ç^q_ l ì m _ , ü w øקlrê .
Y¼ü w ø× , hÇ^_ l ì m ìÛê½À§lrê .
ÒH :
pÉÆ = substr( $2, 1, length($2) - 3 )
ÀÁÆ = substr( $2, length($2) - 2 )

èkG ïÜéJCæìºÁÎè¡ , Ï AWKÁÎæìáÀONpÉÆÎÀÁÆj}


ó GÓ£Pºæì .
æìÀjr¸ FS ( eld seperator) O AWKººØÜÆ , äw]ÈOÅÕ
Î tab. AWKC¸ÁÎæìÉ£|ýÑÒ FS ººe . Yâ ":"]í¨Àjr
29
¸ , h AWK KàÛÊÀâpÉÆÎÀÁÆÀj¨£Pºæì .
GO
FS = "[ nt:]+" (ù : [ nt:]+ °@ Regular Expression )

1. Regular Expression ¤ÏΤA ¹ [ ... ] í@r¸°X , ÎHíÜô


N@Óì ó â¤A ¹ ¡ºr¸ .
GiÎ \[ nt:]"íÜ @Ó ÅÕ , tab Î \:"
2. Regular Expression¤ÏÎ \+" Îeäeèºr¸iX{@¸ Î @¸
HW .
G \[ nt:]+" íÜ Ñ@Ó Î hÓ \ÅÕ , tab Î : " Ò Õ¨ºrê .

] w FS ="[ nt:]+" á , ê ÆCp : \1034 7:26" NQÀΨ 3Óæì .


Ä@æ ÄGæ ÄTæ
$1 $2 $3
1034 7 26
ú ãa , AWK{¡¤ÏÎèk@ñèkGó²äèK . » d Ò¤ÄÎèkG ,
]Ç¹Ü d ïÜæìÁÎ衧Î~ .

s g AWK{¡ reformat3 , pU :

awk '
BEGIN f
FS = "[ nt:]+" #ïÜæìÁκè¡
"date" | getline # Shell õæ \date". getline úo²GH $0öý
print " Today is " , $2, $3 > "today rpt3"
print "=========================" > "today rpt3"
print \ ID Number Arrival Time" > \today rpt3"
close( "today rpt3" )
g

30
f
#wóïæìÁÎè¡ , $2íìFpÉÆ , $3íÀÁÆ
arrival = HM to M($2, $3)
printf(" %s %s:%s %snn", $1, $2, $3
, arrival > 480 ? "*": " " ) | "sort +0n >>today rpt3"
total += arrival
g
END f
close("today rpt3") #ÑÒ» ` ¡ ú 5
close("sort +0n >> today rpt3")
printf(" Average arrival time : %d:%dnn",
total/NR/60, (total/NR)%60 ) >> "today rpt3"
g
function HM to M( hour, min )f
return hour*60 + min
g
' $*
ÃõæpUüO :
$ reformat3 arr.doc
õæá ,É× today rpt3 ººepU :
Today is Sep 21
=========================
ID Number Arrival Time
1005 8:12 *
1006 7:45
1008 8:01 *
1012 7:46
1025 7:27
1028 7:49
1029 7:57
1034 7:26
1042 7:59
1051 7:51
1052 8:05 *
1101 7:32
Average arrival time : 7:49

¡ú:

31
1. AWK ¤ç ¹ \ Ï Î Ì Û w ç Æ . çÆ w q è ¡ Ð Ñ Ò » { ¡ , function °
AWK ºO d r . HM to M ( ) oç Æ td N Ò Ç J §p É ÎÀ Á Æ à« ¨ H
ÀÁ°æì . ÏÎÌÛ w çÆÉ , Ù³\hÓ ` ·dß , p data scope,..( Ð ÑÒ
ÄQ ` Recursive Program)

2. AWK¤ç£ÑP C y¥¤ÛPº Conditional Operator. W¡ printf()¤ÏÎ


arrival >480 ? "*" : " " Y°@Ò
Y arrival j ó 480 h return "*" , _h return " ".

3. % ° AWK§Bâl (operator), ä@ÎP C y¥¤§ % ÛP (úlÆ ).

4. NR(Number of Record) ° AWKºº ØÜÆ . í AWKõæ Ó {¡á Ò ª Jº


öý§Æ .

5. AWK ¤£Ñº close( )üO , ykpU (³GØ ) :


1. close( lename )
2. close( mó pipe§eº command )
°ó»{¡ÏÎFâÓ close( ) üO :
 üO clsoe( "sort +2n >> today rpt3" ), äNä° close {¡¤ m ó "sort
+2n >> today rpt3 " §eº Pipe, Ãßè I s Shell Óõæ "sort +2n
>> today rpt3".
( Y¼õ æo ü O , AWK²· ó ²ô Ó { ¡ É~ |i æW z Ê@ ; ho 12§
sortẠê ÆNQ append ìÉ× today rpt3 ¤ "Average arrival time
: ..." ºáè )
 ]° Shell ÆÇẠê Æ]ngì today rpt3 , Ò H AWK²·ýö¬ÏÎ
¤º today rpt3 HQ Shell ¿ T NÆÇẠê Æ append ì today rpt3 ,
_h 2Ó£Pº process PÉ}Ò@É×iæéXN|£Í£iwÁº²G .
ªÌ³dßWzâI ,~i¿ T ±î ê ÆéXìÉפº¶Ç .

6. üO close("sort +0n >> today rpt3")¤rê "sort +0n >> today rpt3" ·
P pipe | áèº Shell Command WÙ@r£t , _h AWKNø°GÓ£Pº
pipe.
ªÌi ó BEGINf g¤ýOÜÆ Sys call = "sort +0n >> today rpt3", {¡
¤A@ßH Sys call NÀ Ó rê .

32
7.5 Using getline to Input File
d Ò : Ó WD ,qÉפªúíëðì¸Æ , ÃÚÚíéXÔ¬pósðìÖpÆ .(ö£
Pºë÷Öp ó £PºÉ× )
À RG
1. {¡¤ÛÊìútÎéÁºë÷WÙ , sµW \late.dat", ΨÖpðì¸ÆºÉ×
WÙ (p : Jullate.dat ,...), ÃHÜÆ late le öý Ó ÉW .
2. Öpðì¸ÆºÉפº ê Ææ¡° :
ûuN ¹ (ID) ðì¸Æ
Òp , õæ»{¡eÉ× Auglate.dat ººe° :
1012 0
1006 1
1052 2
1034 0
1005 0
1029 2
1042 0
1051 0
1008 0
1101 0
1025 1
1028 0

s g{¡ reformat4.awk pU :
awk '
BEGIN f
Sys Sort = "sort +0n >> today rpt4"
Result = "today rpt4"
# ïÜæìÁκè¡
# O Shellõæ \date"; getline ªú²G ,ÃH $0öý
FS = "[ nt:]+"
"date" | getline
print " Today is " , $2, $3 > Result
print "=========================" > Result
print \ ID Number Arrival Time" > Result

33
close( Result )
# qÉö¤ªúðì ê Æ , ÃÎ}C cnt[ ]Oý . }C cnt[ ]¤HûuN ¹ °
# ùÐ , Ò ï³ºÈ° Ó ûu§ðì¸Æ .
late le = $2 "late.dat"
while( getline < late le > 0 ) cnt[$1] = $2
close( late le )
g
f
# wóïæìÁÎè¡ , $2ípÉÆ ,$3íÀÁÆ
arrival = HM to M($2, $3)
if( arrival > 480 )f
mark = "*" # YíÑðì ,³AW[äðì¸Æ , BO mark ° "*".
cnt[$1]++ g
else mark = " "
# message ÎHãÜ Ó ûuºðìÖpÆ , Y¼¿ðì message °Årê
message = cnt[$1] ? cnt[$1] " times" : ""
printf(" %s %2d:%2d %5s %snn", $1, $2, $3, mark,
message ) | Sys Sort
total += arrival
g
END f
close( Result )
close( Sys Sort )
printf(" Average arrival time : %d:%dnn", total/NR/60,
(total/NR)%60 ) >> Result
#N}C cnt[ ]¤sºðì ê Æg^Éפ
for( any in cnt )
print any, cnt[any] > late le
g
function HM to M( hour, min )f
return hour*60 + min
g
' $*
õæá , today rpt4 §ºepU :
Today is Aug 17
================================
ID Number Arrival Time

34
1005 8:12 * 1 times
1006 7:45 1 times
1008 8: 1 * 1 times
1012 7:46
1025 7:27 1 times
1028 7:49
1029 7:57 2 times
1034 7:26
1042 7:59
1051 7:51
1052 8: 5 * 3 times
1101 7:32
Average arrival time : 7:49

¡ú:
1. late le O@ÜÆ , ÎHOýðì¸ ÆºÉקÉW . late le §ÈÑâ¡ Àc¨
, eb¡Oíëë÷WÙ (Ñ I s "date"úo ) áb¡ Tw ° "late.dat" p : Jun-
late.dat .
2. üO getline < late le íÑ late le Ò NíºÉפªú@§öý , Ãs ñ ó $0.
YÏÎÌiÛæâ ê Æ ñ J $0, AWK|ÛÊïos m J $0 º ê ÆiææìÀÎ .
§á{¡¤iÎ $1, $2,..ÓíÜ Ó § ê ƺÄ@æ ,ÄGæ ,..,
(ù : ³ÖÆ AWK©»£e\ÏÎÌÛæN ê Æ m ó $0, J¹¡piïÎ gawkÎ
nawk)
õæ getlineüOÉ , Y¨\ªúöý ,¦|Ç^ 1. YJìÉײô , ¦Ç^ 0; Lk
}ÒÉ×hÇ^ -1.
3. QÎ while( getline < lename > 0 ) f....g iªJÉפºC@§ ê Æé
Bz . oO AWK¤ userÛæªúÉ× ê ƺ@Ó«nÒ¡ .
4. }C late cnt[ ] Hûu ID. íùÐ (index), äï³Èíäðìº¸Æ .
5. õæ²ôá , QÎ for( Variable in array )f..g§yk for( any in late cnt
) print any, late cnt[any] > late le
NósLºðì ê Æ«sg^Oýðì¸Æ§É× . Ó yk ó Ä 5` ¤ ¿³¡ ú .

35
8 Multi-line Record
AWKC¸ q ê Æ É ¤ u ª ú @ § Record, iæ B z . AWKYÌÓ ä º Ø Ü Æ
RS(Record Separator) º w q NÉפº ê ÆÀj¨@§@§º Record.
RS ºw]ÈO "nn"(õ æÅ ¹ ), G­` AWK¤@æ ê ÆNO@§ Record.
ý³ÇÉפ@§ Record[\FÆæ ê Æ , oØ¡pU£àAH "nn" ÓÀj Records.
Ì`ÏκèkOÛFº Records§¡ïH @ÓÅÕæ Ój} .
b AWK{¡¤ , O RS = ""(Årê )á , AWKâ|ÅÕæí¨ÓÉפ RecordºÀj
Å ¹ . ãM AWKï RS = "" t³ Ñ Àè¡ ,²¤yzpU ,
í RS = "" É :
1. ÆÓÖ FºÅÕæ , AWKÈø¨@ Óæ@º Record Saparator.(AWK£| ó â
ÓòÖºÅÕ槡ªú@§Åº Record)
2. AWK|¤L (skip)ɺ Πɽ ºÅ Õ æ . G£ |] °É º Î É ½º ÅÕ æ , y¨
AWKhªJFG§Åº ê Æ .
Ð [îUÒ ,ºýØß@Ó ê ÆÉ week.rpt pU :

iø}
GNUPLOT Jù
dêj
Latex ²¶
VAST-2 ÏÎâU

mathematica

õpØ
AWK Tutorial Guide
Regular Expression

Ó É× Éº³ÆCÅÕæ , U§ Record§¡Ï Î@Ó Î ÆÓÅÕæ j} . ªÌ Ð Óß[


î , í RS = "" É , AWKªú Ó ê ÆÉ§è¡ .

36
s è@Ó AWK{¡É× make report pU :

awk '
BEGIN f
FS = "nn"
RS = ""
split( "@ . G . T . | . ­ . » . C . K . E .", C Number, " " )
g
f
printf("nn%s øiH : %s nn",C Number[NR],$1)
for( i=2; i >= NF; i++)
printf(" %d. %snn", i-1, $i)
g
' $*

õæ
$ make report week.rpt
Ãõ£Í²GpU :

@ . øiH : iø}
1. GNUPLOT Jù
G . øiH : dêj
1. Latex ²¶
2. VAST-2 ÏÎâU
3. mathematica Jù
T . øiH : õpØ
1. AWK Tutorial Guide
2. Regular Expression

¡ú :
1. »{¡PÉ]ïÜæìÀjr¸ ( FS= "nn"), p¹@§ ê ƤºC@æ£O@Ó
eld.
Òp : AWKªJºÄ@§ Record °
iø}
GNUPLOT Jù
37
ä¤ $1 üºO "iø} ", $2 üºO "GNUPLOT Jù "

2. W¡¤º C Number[ ]O@Ó}C (array), ÎHOý¤åÆr .


Òp : C Number[1] = "@ ", C Number[2] = "G "
oL{ÏÎ AWKrêçÆ split( ) Óâ¤åÆr ñ i}C Number[ ]¤ .
çÆ split( )ÎkpU :
split( ìrê , }CWÙ , Àjr¸ ( eld separator) ) :
AWKNÌ Ò ü w ºÀjr¸ ( eld separator)Àj ìrê ¨
@ÓÓºæì ( eld), ÃHü w º }C OýUÓQÀjºæì

38
9 Getting Arguments on Command Line
j¡Àº³Î{¡£e\ÏÎÌ ó R O§áW[@ÇïÜ Ê ºÑÆ . õæ AWKÉ
oÇÑÆj¡ÀÎ ó ü w ê ÆÉÉW , ³ÉÆæb{¡¤àq R OCWoì@Çä¦Î~
º ê Æ . »p ` ¤NÔzpób AWK{¡¤úÎoÇÑÆ .
ØßÉ×pU , R W° see arg :
awk '
BEGIN f
for( i=0; i<ARGC ; i++)
print ARGV[i] # ̸LX AWKÒ öýºÑÆ
g
' $*
õæpU R O :
$ see arg rst-arg second-arg
²GÃõX{ :
awk
rst-arg
second-arg
¡ú :
1. ARGC, ARGV[ ] ° AWKÒ £ÑººØÜÆ .
 ARGC : °@ãÆ . Ní R OCW , £Fïµ -v, -f ÎäﳺÑƧ~ Ò ³
ÑƺÆØ .
 ARGV[ ] : °@rê}C . ARGV[0],ARGV[1],...ARGV[ARGC-1]. À
ONí R OCWÛﳺÑÆ .
Òp , í R OC° :
$ awk -vx=36 -f program1 data1 data2
Î
$ awk
'f print $1 ,$2 g' data1 data2
ä ARGC §È° 3
ARGV[0] §È° "awk"
ARGV[1] §È° "data1"
ARGV[2] §È° "data2"
R OCWº "-f program1", "-vx=36", Î {¡¡À 'f print $1, $2 g' ££|
CJ ARGC Î ARGV[ ] ¤ .
39
2. AWK QÎ ARGC ÓP_³}Òº ê ÆÉÓÆ .
ýÏÎÌijæïÜ ARGC; í ARGC §ÈQÏÎÌ]° 1 É ; AWKNQ©F
, ~H° R OCWÃL ê Æ ÉÉW , G£|H ARGV[1], ARGV[2],..°É WÓ}
ɪú ê Æ ; ý ó {¡¤´iÇÑ ARGV[1], ARGV[2],..Óúo R OCWº ê Æ .
Y@{¡ test1.awk pU :
BEGINf
number = ARGC #ýÎ number OíêÚºÑÆÓÆ .
ARGC = 2 # Ûæóï ARGC=2, AWKNH°u³@Ó ê ÆÉ
# ´iÇÑ ARGV[ ]úo R OCWº ê Æ .
for( i=2; i<number; i++) data[i] = ARGV[i]
g
........
óR OCWäJ
$ awk -f test1.awk
data le apple orange
õæÉ AWK |}Ò ê ÆÉ data le HiæBz . £|}ÒH apple, orange
°ÉWºÉ× (]° ARGC Qï¨ 2). ý´iÇÑ ARGV[2], ARGV[3] úo R
OCWºÑÆ apple, orange

3. iHUC R OÓF¨WÒºÄG .
$ awk -f test2.awk -v data[2]="apple" -v data[3]="orange" data le

40
10 Writing Interactive Program in AWK
õæ AWK{¡É , AWK|ÛÊÑÉפªú ê ÆÓiæBz , ½ìÉײô . u
nN AWKªú ê ƺ Ó½ï ¨ä L éJ , Ki]p P AWK interactive talk º{¡ .
» ` N£Ñ@Ó Ó þ{¡º d Ò .

dÒ : » ` N¶g@Ó^yÍrúçº{¡ , ¦NLX¤årN ,AÑÏÎÌ^ªä^yÍ


r.
ºý s è@Ó ê Æ× test.dat (ºe£ ë ,æ¡pU )

apple «G
orange hí
banana »¼
pear ùl
starfruit ¨ç
bellfruit ¬ ú
kiwi _ §G
pineapple ñù
watermelon èÊ
s è AWK{¡ "c2e"pU :

awk '
BEGIN f
while( getline <ARGV[1] )f #Ñü w ºÉפªúúç ê Æ
English[++n] = $1 # Ìá , n NíÜDاDÆ
Chinese[n] = $2
g
ARGV[1] = "-" # "-"íÜÑ stdin(ä L éJ )
srand() # HtÎÉ¡°ÃÆÒ l ºØl
question( ) #£ÍÒD
g

41
f # AWKÛʪJÑä L WéJº ê Æ (ÏÎÌ^ªºª× )
if( $1 != English[ind] )
print "Try again!"
elsef
print "nnYou are right !! Press Enter to Continue | "
getline
question( ) #£ÍÒD
g
g

function question()f
ind = int(rand( )* n) + 1 #HÃÆïúÒD
system("clear")
print " Press n"ctrl-d n" to exit"
printf("nn%s ", Chinese[ind] " º^åÍrO : ")
g
' $*

õæÉäJpUüO :
$c2e test.dat
ÃõN£ÍpUºe± :
Press "ctrl-d " to exit
¬ ú º^åÍrO :
YéJ bellfruit
{¡N£Í
You are right !! Press Enter to Continue |
¡ú:
1. ÑÆ test.dat (ARGV[1]) íÜxsÒDº ê ÆÉÉW . AWK Ñ Ó É×Wúo
ÒD ê Æá , N ARGV[1] ï¨ "-".
"-" íÜ Ñ stdin(ä L éJ ) ê Æ . ä L éJ ê Æ º² ôÅ ¹ (End of le) O
Ctrl-d. í AWK ªì Ctrl-d ÉN±îÑ stdin ªú ê Æ .

42
2. AWKºÆÇçƤ£ÑâÓPÃƳöºçÆ .
rand( ) : Ç^¶ ó 0P 1§¡º (ñü )ÃÆÈ . 0 <rand() <1.
£DÏÎÌÛæü w rand() çÆ_ l º seed, _hC¸õæ AWK{
¡É , rand() çÆ£NHP@Óº w º seed °Ò l , Ó£ÍÃÆ .
srand(x) : ü w H x° rand( ) çÆ_ l º seed. YÙ ¤F x, h AWK|H
õæ ɺ éÁ PÉ ¡° rand() çÆ_ l º seed. (ÑÒ þý C
AWK º Built-in Functions )

43
11 Recursive Program
AWK ¤£ F ç Æ º Ñ Æ C (Argument List)Wº Ñ Æ (Arguments)~ , Ò ³ Ü Æ £
Þ ó ó B X { þ Q ø ° Global variable. äÍ R ù ò Ü { ¡ ² ô | Ó Ü Æ £ × b
function~ Î functionºÒiÏÎ , unÜÆWÙÛP Ò ÏκNOP@ÓÜÆ , ½ì{
¡²ô . ] Recusive çƺ¡ºÜÆ , |]¦ I slçÆ (»­ )Ó«ÐÏÎ , G¶g Ó
þçÆÉ , ³SOdß .
Òp : õæ
awk '
BEGIN f
x = 35
y = 45
test variable( x )
printf("Return to main : arg1= %d, x= %d, y= %d, z= %dnn",
arg1, x, y, z)
g

function test variable( arg1 )f


arg1++ # arg1 °ÑÆCWºÑÆ , O local variable. ÷}¹çÆáNø¢ .
y ++ # |ïÜD¡¤ºÜÆ y
z = 55 # z ° Ó çƤsÏκÜÆ , D{¡¤ÜÆ z ´iQÏÎ .
printf("Inside the function: arg1= %d,x= %d, y= %d, z= %dnn",
arg1, x, y, z)
g'

²GÃõLX
Inside the function: arg1= 36,x= 35, y= 46, z= 55
Return to main : arg1= 0, x= 35, y= 46, z= 55

ÑWi¾ :
 çƺiôNÏÎD{¡¤ºôóÜÆ .
 çƺ Ò ÒκôóÜÆ (£ÑÆ~ ), óÓ çƧ~ÌMiHÏÎ .

¹S Ê uHÑb , ÌjºaBO¡¤ºÜÆ£ ö QO@ , SOO recursiveI s»­ , õæ


lçÆÉ|}a÷çƺºÜÆ .

44
vܺèkO : bçƺ Argument list WêC@Ç Arguments.
çÆõæ¤ÏÎoÇêCº Arguments ÓOý£QQ}aº ê Æ , p¹õælçÆÉN
£|}aìoÇ ê Æ . ¹~ AWK ã|Ëd , I sçÆÉ Ò Ç¼ºÑÆÓÆO_@P .
Òp : wq recursive function pU :
function demo( arg1 )f # Ì`£ºù~Òl
........
for(i=1; i<20 ; i++)f
demo(x)
# S I s»­ . ]° i O global variable, Gõæ¹ Ó lçÆá
# ìçƤº i w g Qa , G»çÆLk¿ T õæ .
.......
g
..........
g

iNWCçƤº i êCb Ó çƺÑÆCW , p¹ i KO@Ó local variable , £|]


õælçÆÓQ}a .
NWCçÆ×ïpU :
function demo( arg1, i )f
......
for(i=1; i<20; i++)f
demo(x) #AWK£|Ëd I sçÆÉ , Ò Ç¼ºÑÆÓÆO_@P
.....
g
g

$0, $1,.., NF, NR,..]£O global variable, ªÌ ó recusive function¤Y³ÏÎo


ǺØÜÆ , ]³t~]ß@Ç local variable ÓOs , HKQ}a .

dÒ : HUO@Ó`£º Recursive d Ò . ¦nDÏÎÌéJ@ê¸À (U¸À¡ÎÅÕ


j} ) MáLXoǸÀ Ò ³iàºÆC .

45
s èpUº AWK¡ , úW° permu
awk '
BEGINf
print "Ð éJÆCº¸À ,U¸À¡ Ð ÎÅÕj} "
getline
permutation( $0, "")
printf("nn@ %d ØÆCè¡ nn", counter)
g

function permutation( main lst, bu er, new main lst, nf, i, j ) f


$0 = main lst # â main lstü w ¹ $0§á AWKNÛÊiææìÀÎ .
nf = NF # GiÎ NF íÜ main lst Wsbº¸ÀÓÆ .
# BASE CASE : í main lstu³@Ó¸ÀÉ .
if( nf == 1) f
print bu er main lst # bu erººesµ (concate)W main lst N
counter++ # O¹¨@¸ÆCº²G
return
g
# General Case : C¸q main lst ¤úX@Ó¸À ñ ì bu er¤
# AÎ main lst ¤ÑUº¸À (new main lst) ¹ UiæÆC
else for( i=1; i<=nf ;i++)f
$0 = main lst # $0($1,$2,..$j,,)° Global variablewQa , G«s
# â main lst ü w ¹ $0, O AWKAµ@¸æìÀÎ
new main lst = ""
for(j=1; j<=nf; j++) # concate new main lst
if( j != i ) new main lst = new main lst " " $j
permutation( new main lst, bu er " " $i )
g
g
' $*

46
õæ $ permu
ÃõWX{
Ð éJÆCº¸À ,U¸À¡ Ð ÎÅÕj}
YéJ 1 2 3 ²GLX
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

@ 6 ØÆCè¡
¡ú:
1. ³Ç û ©º AWK,ãe\ÏÎÌü w $0§È . ¹ÉiïÎ gawk, Î nawk. _
h]iÛæÏÎ split() çÆÓÀÎ main lst.
2. °×KõælçÆÉ}a new main lst, nf, i, j GâoÇÜÆ]C ó ÑÆCW . p
¹ , new main lst, nf, i, j NQí¨ local variable,Ó£|üìlçƤPWºÜ
ÆvT . ªÌÅiçÆÉ ,ÑÆCW£«NoÇ \êCºÑÆ " Pu¿Î ó Ǽ ê T
ºÑÆ¡H û øºÅÕj} , HK ó ÏO .
3. AWK ¤ýNrê concatenation(sµ )É , ½µNârêÖ m Yi (Implicit Op-
erator).
Òp :
awk '
BEGINf
A = "This "
B = "is a "
C = A B "key." # ÜÆ AP B§¡³dÅÕ , _h "AB"NNít@s
ÜÆ .
print C
g'
²GNLX
This is a key.

4. AWKÏÎÌ Ò ¶gºçÆiA reuse, ãÝnCÓ AWK¡¤£«s¶g .


NçÆ¡Àæª s g ó @Éפ , íÝnÎì Ó çÆÉAHUCè¡ includeiÓ .
$ awk -f çÆËW -f AWKD{¡ÉW ê ÆÉÉW

47
Appendix A Patterns
AWK ÇÑP_ Pattern §ÈÓM w O_õæäá Ò ï³º Actions.
o Ì CXXØ`£º Pattern :

1. BEGIN
BEGIN ° AWK ºOdr , O@ØSíº Pattern.
BEGIN ¨ß (äÈ° true)ºÉ÷O :
\AWK {¡@} l õæ , | ¼ªúôó ê Ƨe ."
Ò Hb BEGIN f Actions g yk¤ , ä Actions ¡÷È ó {¡@} l õæÉQ
õæ@¸ . í AWK q ê ÆɪJ ê ÆCá , BEGIN K£A¨ß , G£ × ³hÖ
ê ÆC , Ó Actions ¡÷ÈQõæ@¸ .
@ë ` â \P ê Æ É º e L ö " P \uÝ õ æ ¸ ¸ " º¡ À m ó Ó Actions(H
BEGIN ° Pattern)¤ .
Òp :
BEGIN {
FS = "[ \t:]" # ó{¡@} É ïÜ ÁÎæìºè¡
l , AWK
RS = "" # ó{¡@} É ïÜ Àj ê ÆCºè¡
l , AWK
count = 100 ] ÜÆ
# w º_ È
count l
print " This is LX@æ title
a title line " \#
}
....... # ä¦ Pattern { Actions } .....

³Ç AWK{ ¡ Æ Ü "£ Ý n ª J ô ó ê Æ C ". Jì o ¡ p i â ã Ó { ¡ m ó H


BEGIN ° Pattern º Actions ¤ .
Òp :
BEGIN f print " Hello ! the Word ! " g

`N : õæ Ó þÈt BEGIN f Actions g º{¡É , AWK ã|}Òôó ê


ÆÉiæBz .

48
2. END
END ° AWK ºOdr , Ot@ØSíº Pattern.
END ¨ß (äÈ° true)ºÉ÷P BEGIN ênÛÏ , ° :
\AWK Bz¹ Ò ³ ê Æ , YN÷}{¡É "
­` ª J ê Æ C É , ENDã ¨ ß , Gä ï ³ º Actions ã Q õ æ ; ß³ í
AWKª¹ Ò ³ ê ÆÉ , Ó Actions ~|Qõæ
`N : £Þ ê ÆC³hÖ§ , Ó Actions ÈQõæ@¸ .

3. Relational Expression
Ïγ \A Relation Operator B" º Expression í¨ Pattern.
í A P B sb Ò ü w ºöY (Relation)É , Ó Pattern Nâ¨ß (true).
Òp :
length($0) <= 80 f print g
W¡¤ l ength($0) <= 80 O@Ó Pattern, í $0(ê ÆC )§ø×p ó ¥ ó 80
É Ó Pattern §È° true, NõæäẠAction(LX Óê ÆC ).
AWK ¤£ÑUC öYB⸠(Relation Operator)
B⸠[N
> jó
< pó
> = j óÎ ¥ ó
< = p óÎ ¥ ó
== ¥ó
!= £¥ ó
~ match
!~ not match
WCöYB⸣ ~(match)P !~(not match)~P C y¥¤§[N@P .
~(match) P !~(match) b AWK §[N²zpU :
Y A í@rê , B í@ Regular Expression.
A ~ B P_ rê A ¤O_ ]t àX ó (match)B¡Ëºlrê .
A !~ B P_ rê A ¤O_ ¼]t àX ó (match)B¡Ëºlrê .

49
Òp :
$0 ~ /program[0-9]+n.c/ f print g
$0 ~ /program[0-9]+n.c/ ãÓO@Ó Pattern, ÎÓP_ $0(ê ÆC )¤O
_t³i match /program[0-9]+n.c/ ºlrê , Y $0 ¤t³ Ó þrê , hõæ
print (LX Ó C ê Æ ).
Pattern ¤QÎÓñïºrê° $0 É (p»Ò ), iÈH Regular Expression ¡
Àí§ . G»Òº Pattern ¡À
$0 ~ /program[0-9]+n.c/ iÈÎ /program[0-9]+n.c/í§
(³ö match Î Regular Expression Ð ÑÒ þý E )

4. Regular Expression
½µÏÎ Regular Expression í¨ Pattern; ¹° $0 ~ Regular Expression
º²g .
Ó Pattern ÎHP_ $0(ê ÆC ) ¤O_t³ match Ó Regular Expression º
lrê ; Yt³ Ó ¨ß (true) hõæäﳺ Actions.
Òp :
/^[0-9]*$/ f print "This line is a integer !" g
P $0 ~ /^[0-9]*$/ f print "This line is a integer !" g ÛP

5. Compound Pattern
§e Ò ¶ Ð º U Ø Patterns, äp â (evaluation)á ² G ° @ Þ è È (True or
False). AWK ¤ÞèÈ ¼ ¹¡iÇÑ &&(and), ||(or), !(not)²X¨@Ósº
ÞèÈ . G£P Patterns ¼ ¹i ÇÑWz ²XÅ ¹ Ó² X¨@ Ósº Pattern.
p¹iiæ Æ øºøóP_ .
Òp:
FNR >= 23 && FNR <=28 f print " " $0 g
W¡QÎ && (and) NâÓ Pattern DȺ²GXÖ¨@ÓÞèÈ .
Ó ¡ N ê Æɤ Ä 23æ ì 28æ Vk¾ 5æ (ýLX 5ÓÅÕr¸ )áLX .
( FNR ° AWKººØÜÆ , Ð ÑÒ þý D )

50
6. Pattern1 , Pattern2
JìoØ Pattern, AWK |°z]ß@Ó switch(Î ag).
í AWKªJº ê ÆCÏo Pattern1 ¨ßÉ , AWK |´} (turn on)o switch.
í AWKªJº ê ÆCÏo Pattern2 ¨ßÉ , AWK |öW (turn o )oÓ switch.
Ó Pattern ¨ßºøóO :
íoÓ switch Q´} (turn on)É (]A Pattern1, Î Pattern2 ¨ßº¡p )
Òp:
FNR >= 23 && FNR <=28 f print " " $0 g
iïg°
FNR == 23 , FNR == 28 f print " " $0 g
¡ú:
1. í FNR >= 23 É , AWK N turn on oÓ switch;
2. ]°HÛ ê ÆCºªJ , AWK£±ºÖ[ FNR.
3. í FNR = 28 É , Pattern2 FNR == 28 K¨ß , oÉ AWK|öWo
Ó switch.
í switch ´}ºÁ¡ , AWK |õæ \print " " $0"
( FNR ° AWKººØÜÆ , Ð ÑÒ þý D )

51
Appendix B Actions
Actions OÑUCüO (statement)Ò Õ¨ :
expression ( function calls, assignments..)
print expression-list
printf( format, expression-list)
if( expression ) statement [else statement]
while( expression ) statement
do statement while( expression)
for( expression; expression; expression) statement
for( variable in array) statement
delete
break
continue
next
exit [expression]
statement
AWK ¤j¡ÀüOP C y¥¤ºÎk@P , ¹BȶРû °`Î Î e ö Vc§üO
ºÎk .
1. y{±îüO
 if üO
yk
if ( expression ) statement1 [ else statement2 ]
dÒ :
if( $1 > 25 )
print "The 1st field is larger than 25"
else print "The 1st field is not larger than 25"
(a) P C y¥¤ÛP , Y expression pâ (evaluate)á§È£° 0 Î Å
rê , hõæ statement1; _hõæ statement2.
(b) iæÞèP_º expressionÒ Ç^ºÈ³âØ , YÌáºÞèÈ° true,
hÇ^ 1, _hÇ^ 0.
(c) yk¤ else statement2 H [ ] eáAííÜ Ó ¡ÀiøÝnÓ©[J
Î Ù¤ .

52
 while üO
yk :
while( expression ) statement
dÒ :
while( match(buffer,/[0-9]+\.c/ ) ){
print "Find :" substr( buffer,RSTART, RLENGTH)
buff = substr( buffer, RSTART + RLENGTH)
}

WC d ÒäX bu er ¤ Ò ³àX ó (match) /[0-9]+_c/( Ær§áµW


\.c"º Ò ³lrê ).
d Ò ¤ while HçÆ match( )Ò Ç^ºÈµ°P_øó . Y bu er ¤
Ùt³X ó ü w øóºlrê (match¨\ ), h match()çÆÇ^ 1, while
Nùòiæä᧠statement.
 do-while üO
yk :
do statement while( expression )
dÒ :
do{
print "Enter y or n ! "
getline data < "-"

} while( data !~ /^[YyNn]$/)


(a) WÒnDÏÎÌqä L WéJ@Ór¸ , Y Ó r¸£O Y, y, N, Î n
h|£±õæ Ó jé , ½ìªú¿ T r¸°î .
(b) do-while üOP while üO Ìjºt§O : do-while üO|ýõæ
statement ÓáAP_O_³~òõæ . Ò H , L × póä statement
¡ÀÜÖ|õæ@¸ .
 for Statement üO (@ )
yk :
for( variable in array ) statement

53
dÒ : õæUC R O
awk '
BEGIN{
X[1]= 50; X[2]= 60; X["last"]= 70
for( any in X )
printf("X[%d] = %d\n", any, X[any] )
}'

²GLX :
X[2] = 60
X[last] = 70
X[1] = 50
(a) oÓ for üO , MÎHjM}¤ Ò ³º indexÈ , Ãv¸ÏÎ Ò ü w ºÜ
Æ ©Höý . H»ÒÓ¥ , ÜÆ any Nv¸Ní 2, 1,Î "last".
(b) HoÓ for üO , Ò jMXº index§È ¼ ¹¡ÃLôó¸òöY .
(c) Ä 7` Arrays in AWK ¤³ Ó üOºÏÎ d Ò , Î Ñ ¡ .
 for Statement üO (G )
yk :
for( expression1; expression2; expression3) statement
dÒ :
for(ñ =1; i<=10; i++) sum = sum + i
¡ú :
(a) WC d ÒÎHpâ 1 [ì 10 º`X .
(b) expression1 `Î ó ] w Ó for jéº_ l øó , pWÒ¤º i=1
expression2 Î ó ] wÓ j麱îøó , pWÒ¤º i<= 10
expression3 `Î ó ïÜ counter §È , pWÒ¤º i++
 break üO
break üOÎHj¢¤_ (õ ÷ ) for, while, do-while ¥jé .
dÒ :
while( getline < "datafile" > 0 ){
if( $1 == 0 ) # Ò ªúº Æ
ê m ó $0
break # AWK ßèâ Wsºæì Æ
$0 ê
else # w ü ¹$1, $2, ...$NF
print $2 / $1
}

54
WÒ¤ , AWK £_aqÉ× data le ¤ªú ê Æ , í $1 ¥ ó 0 É , N
±î Ó õæjé .
 continue üO
j餺 statement iæì@bÉ , õæ continue üOÓ°L^é¤ |
¼õæº statement. d Ò :
for( index in X_array){
if( index !~ /[0-9]+/ ) continue
print "There is a digital index", index
}
(a) WÒ¤Y index £°Ærhõæ continue, GN°L (£õæ )äáº
üO .
(b) Ýdß continue P break ºt§ : õæ continue uO°Läá¼
õæº statement, ýü õ ÷} Ó jé .
 next üO
õæ next üOÉ , AWK N°Lì ó Ó üO (next)§áº Ò ³üO (]A
äáº Ò ³ Pattern f Actions g), µÛªúU@§ ê ÆC , ~òqÄ@Ó
Pattern f Actions g õæ_ .
dÒ :
/^[ \t]*$/ { print "This is a blank line! Do nothing here !"
next
}
$2 != 0 { print $1, $1/$2 }
WÒ¤ , í AWK ªJº ê ÆC°ÅÕæÉ ( match /^[ n]*$/ ) £CLT
§~Bõæ next, G AWK N°LäáºüO , ~òªúU@§ ê Æ , q
Y (Ä@Ó Pattern f Actions g)õæ_ .
 exit üO
õæ exit üOÉ , AWKNßè õ ÷ (±îõæ )Ó AWK{¡ .

2. AWK ¤º I/O üO
 printf üO
Ó üOP C y¥¤ºÎkÛP , iÇÑ Ó üO±î ê ÆéXÉºæ¡ .
yk :
printf( "format", item1, item2,..)
dÒ:

55
id = "BE-2647"; ave = 89
printf("ID# : %s Ave Score : %d\n", id, ave)
(a) ²GLX :
ID# : BE-647 Ave Score : 89
(b) format ¡À Y Ñ @ë º r ê (String Constant) Î æ¡ ± î r ¸
(Format control letter, äe|[W@Ó %r¸ )Ò c¨ . HW¡°Ò
"ID# : " Î " Ave Score : " °@ërê . %s Î %d °æ¡±î
r¸ .
(c) LXÉ , @ërêNQìÊ£ÊaLX . Jì桱îr¸É , hÌÇâ
format áè§ item ૨ Ò ü w ºæ¡áLX .
(d) ³öºÓ ` , ªÌiq¶Ð C y¥ºÑyWoì û ¹ãº¶Ð .
(e) print Î printf âÓüO , äáiÏÎ > Î >> NéXì stdoutº ê
Æ Redirct ìä¦É× , 7.1 Redirect Output to Files ¤³¹ãº
d Ò¡ ú .

 print üO
dÒ:
id = "BE-267"; ave = 89
print "ID# :", id, "Ave Score :"ave
(a) ²GLX : ID# : BE-267 Ave Score :89
(b) print §áiµWrê`Æ (Constant String)Î ÜÆ . ¦Ì ¼ ¹¡i
Î \," j} .
(c) W¡¤ , rê "ID# :" PÜÆ id §¡ÏÎ \,"j} , LXÉâ̧¡
|HÛÊ OFS(Ð ÑÒ D ºØÜÆ OFS) j} . OFS §È@ëº w
° "@ÓÅÕr¸ "
(d) W¡¤rê "Ave Score :" PÜÆ ave§¡Ã¼H \,"j} , AWK|N
oâ Ìýí ¨r ê concateb@ _ (Ü ¨ \Ave Score :89")á , A© L
X
(e) print Î printf âÓüO , äáiÏÎ > Î >> NéXì stdoutº ê
Æ Redirct ìä¦É× , 7.1 Redirect Output to Files ¤³¹ãº
d Ò¡ ú .

 getline üO
yk ÑóBªú ê Æ ê ƪJá m ó
getline var< le Ò ü w º le ÜÆ var(varÙ¤É ,íÜ m ó $0)
| getline var pipe ÜÆ var(varÙ¤É ,íÜ m ó $0)
getline var £ ù@ ÜÆ var(varÙ¤É ,íÜ m ó $0)

56
ù@ : í Pattern ° BEGIN Î END É , getline NÑ stdin ªú ê Æ ,
_hÑ AWK¿Bzº ê ÆÉWªú ê Æ .
getline @¸ªú@æ ê Æ ,
Yªú¨\h return 1,
Yªú¢Ñh return -1,
YJìÉײô (EOF), h return 0
 close üO
Ó üOÎHö¬@Ó}ÒºÉ× , Î pipe(£UÒ ) d Ò :
awk '
BEGIN { print "ID # Salary" > "data.rpt" }

{ print $1 , $2 * $3 | "sort +0n > data.rpt" }

END { close( "data.rpt" )


close( "sort +0n > data.rpt" )
print " There are", NR, "records processed."
}
¡ú:
(a) WÒ¤ , @} l õæ print "ID # Salary" > "data.rpt" üOÓLX
@æ ï Y . ¦ÏÎ I/O Redirection( > )N ê ÆàéXì data.rpt ,
G¹ÉÉ× data.rpt OB ó Open ¬A .
(b) üO print $1, $2 * $3 £±ºNLXº ê Æe ¹ pipe(|), AWK ó
{¡N²ôÉ~| I s shell ÏÎüO "sort +0n > data.rpt" ÓB
z pipe ¤º ê Æ ; üßYõæ , oIP Unix ¤ pipeºÎk£ÉÛ
P.
(c) ÌáÆæ ó É× data.rpt § \½À "B[W@æ "There are.....". ý
¹É , Shell | ¼õæ "sort +0n > data.rpt" GU ê ÆCÆ Çáº
ID Î Salary ¥ ê Æ | ¼gJ data.rpt . Ò Ho R O AWK £e
ýq ¾ Shell õæ R O "sort +0n > data.rpt" ÓB z pipe ¤º
ê Æ . AWK¤o Ó Ê @ Ù ° close pipe. YÑ õ æ close( "shell
command" )Ó¹¨ . Ýdß close( )üO¤º shell command ÝP
\|"áèº shell command ¹þÛP (@r£t ), û κèkOýH Ó
rê w q @Ó²uºÜÆ , {¡¤AH¹ÜÆNÀ Ó shell command
(d) °° ònõ æ close("data.rpt") ? ]° sort ¹áº ê Æ] Ng ì
data.rpt , Ó Ó É׿° AWKÒ }ÒÏÎ (write)¤ , G AWK{¡¤
57
³ýö¬ data.rpt . HKy¨]GÓ processes PÉ}Ò@ÓÉ×i
æéX (write)Ò £Íºù~ .
 system üO
Ó üOÎHõæ ShellW º command. d Ò :
DataFile = "invent.rpt"
system( "rm " DataFile )
¡ú :
(a) system("rê ")üOµü@Órêí¨ Shellº R O . WÒ¤ , ÏÎ@Ó
rê`Æ "rm " sµ (concate)@ÓÜÆ DataFile ΨnD Shellõ
æº R O .
Shell êÚõæº R O° \rm invent.rpt".
 \|" pipeüO
\|" tX AWK éX üO , iâ output ì stdout º ê Æ~ òà e ¹
Shell WºO@ R Oí¨ inputº ê Æ .
\|" tX AWK getline üO , i I s Shell õæY@ R O , AH AWK
º getline üON ÓR Oº Ò £Íº ê ƪi AWK {¡¤ .
dÒ:
{ print $1, $2 * $3 | "sort +1n > result" }

"date" | getline Date_data


ªÌ Ð ÑÒ 7.2 Using System Resources 䤳¹ãº d Ò¡ ú .

3. AWK À ñÒ ûκOÐéºüO
AWK {¡¤`ÏÎ}C (Array)ÓOÐjq ê Æ . delete üOKOÎÓÀ ñ }
C¤º¸À ÒÒ ûκOÐÅ¡ .
dÒ:
for( any in X_arr )
delete X_arr[any]

ªÌ Ð dß , delete üO@¸uàÀ ñ }C¤º@Ó \¸À ".


4. AWK ¤ºÆÇB⸠(Arithmetic Operators)
+([ ), -(î ), *(¼ ), /(£ ), %(DlÆ ), ^(üÆ ) P C y¥¤ÎkÛP

58
5. AWK ¤º Assignment Operators
=, +=, -=, *= , /=, %=, ^=
x += 5 ºNä° x = x + 5, älþÀ .
6. AWK ¤º Conditonal Operator
yk:
P_øó ? value1 : value2
Y P_øó ¨ß (true) hÇ^ value1, _hÇ^ value2.
7. AWK ¤ºÞèB⸠(Logical Operators)
&&( and ), ||( or ), !(not) Extended Regular Expression ¤ÏÎ \|" íÜ
or Ð ÅVc .
8. AWK ¤ºöYB⸠(Relational Operators)
>, >=, <, <=, ==, !=, , !

9. AWK ¤ä¦ºBâ¸
+(¿ ¹ ), -(t ¹ ), ++(Increment Operator), - -(Decrement Operator)

10. AWK ¤UB⸺Bâuý¶Ç ( Precedence )


(öuýªCÆC )
$ (æìB⸠Òp , íÜÄ æ
: i=3; $i 3 )
^ (üÆBâ )
+ ,- ,! ¿ t ÎÞèWº
( , ¹, not)
* ,/ ,% ¼ £ lÆ
( , , )
+ ,- [ î
( , )
>, >=,< j j ¥ ¥öYÅ ¹ )
, <=, ==, != ( ó , ó ó ,...,
~, !~ (match, not match)
&& (ÞèWº and)
|| (ÞèWº or )
? : (Conditional Operator)
= , +=, -=,*=, /=, %=, ^= ( @Çü
w Assignment B⸠)

59
Appendix C Built-in Functions
(@ ). rêçÆ
 index( ìrê , äMºlrê ) :
Yì rê ¤t³ ýä Mº lrê ,hÇ^ Ó l rêb ìr ê¤ Ä@ ¸X{ ºì m ,Y
¼¿X{ Ó lrêhÇ^ 0.
Òpõæ :
$ awk 'BEGIN f print index("8-12-94","-" g'
²GLX 2
 length( rê ) : Ç^ Ó rêºø× .
Òpõæ :
@@ $ awk 'BEGIN f print length("John") g'
²GLX 4
 match( ìrê , ÎHäMñïº Regular Expression ) :
AWK|bìrê¤äMXG Regular Expressionºlrê . YXGøóºlrê
³hÓ , hHìrê¤Ìªèºlrê°Ç .
AWKäì Ó rêá|̹rê°ÌÚiæUCÊ@ :
1. ] w AWKºØÜÆ RSTART, RLENGTH :
RSTART = Xøó§lrêbìrꤧì m .
= 0 ; Y¼äìXøóºlrê .
RLENGTH = Xøó§lrêø× .
= -1 ; Y¼äìXøóºlrê .
2. Ç^ RSTART §È .
Òpõæ :
$ awk ' BEGIN f
match( "banana", /(an)+/ )
print RSTART, RLENGTH
g
'
@@@ õæ²GLX 2 4

60
 split( ìrê , }CWÙ , Àjr¸ ( eld separator) ):
AWKNÌ Ò ü w ºÀjr¸ ( eld separator)ÓÀjìrê¨@ÓÓºæì ( eld),Ã
Hü w º}COýUÓQÀjºæì .

Òp :
ArgLst = "5P12p89"
split( ArgLst, Arr, /[Pp]/)
õæá Arr[1]=5, Arr[2]=12, Arr[3]=89
 sprintf( CL§æ¡ , CL§ ê Æ , CL§ ê Æ ,...)
Ó çƧÎkP AWKÎ CºéXçÆ printf()ÛP . Ò £PºO sprintf()|NnD
LXº²Gí¨@ÓrêÇ^
@ëÌ`ÏÎ sprintf()ÓïÜ ê Ææ¡ . p : x °@ÆÈ ê Æ , YýNäܨ@Ót
Gìpƺ ê Æ ,iõæpUüO :
x = 28
x = sprintf("%.2f",x)
õæá x = "28.00"
 sub( ñïκ Regular Expression, NÀ«ºsrê , ìrê )
sub( )Nìrê¤Ä@Ó (̪ä )XG Ò ü w º Regular Expression ºlrêï
HsrêúN .
1. ÄGÓÑÆ "NÀ«ºsrê "¤iÎ "&"ÓNí "X ó øóºlrê "
Ó WÒ ,õæUCüO :
A = "ab12anan212.45an6a
sub( /(an)+[0-9]*/, "[&]", A)
²GLX ab12[anan212].45an6a
2. sub()£È i õ æ ú N (replacement)º\ Î ,í Ä G Ó Ñ Æ ° Å r ê ("")É ,
sub()Ò õæºO \h£ü w rê "º\Î .
3. ÇÑ sub()P match()ºftÏÎ ,iv¸ú Xìrê¤X Gü w øóº Ò ³
lrê .

61
ÒpõæUC{¡ :
awk '
BEGIN f
data = "p12-P34 P56-p61"
while( match( data ,/[0-9]+/) >0) f
print substr(data,RSTART, RLENGTH )
sub(/[0-9]+/,"")
g
g
' $*
²GLX :
12
34
56
61
4. sub( )¤ÄTÓÑÆ (ìrê )Y¼ü w ,häw]È° $0.
iÎ sub( /[9-0]+/,"digital" ) íÜ sub(/[0-9]+/,"digital",$0 )
 gsub( ñïκ Regular Expression, NÀ«ºsrê , ìrê )
oÓçÆP sub()@Ë ,PËOiærêúNºçÆ . ß@£PIO

1. gsub()|úN Ò ³Xøóºlrê .
2. gsub()|Ç^QúNºlrêÓÆ .
Ð ÑÒ sub().
 substr( rê ,_ l ì m [,ø× ] ) :
Ç^q_ l ì m _ ,ü w øקlrê . Y¼ü w ø× ,hÇ^_ l ì m ìÛê½À§
lrê .
õæUÒ
$ awk ' BEGINf print substr( "User:Wei-Lin Liu", 6)g'
²GLX
Wei-Lin Liu

62
(G ). ÆÇçÆ
 int(x) : Ç^ xºãÆ¡À (h¼pÆ ).
Òp :
int(7.8) NÇ^ 7
int(-7.8) NÇ^ -7
 sqrt(x) : Ç^ xº­èÚ .
Òp :
sqart(9) NÇ^ 3
Y x °tÆ ,hõæ sqrt(x)ÉNy¨ Run Time Error
 exp(x) : NÇ^ eº x¸è .
Òp :
exp(1) NÇ^ 2.71828
 log(x) : NÇ^ xH e° ³ ºïÆÈ .
Òp :
log(e) = 1
Y x<0 ,hõæ sqrt(x)ÉNy¨ Run Time Error.
 sin(x) : x ·H|×q°æì ,sin(x)NÇ^ xº sinçÆÈ .
 cos(x) : x ·H|×q°æì ,cos(x)NÇ^ xº cosçÆÈ
 atan2(y,x) : Ç^ y/x º tanÏçÆ§È ,Ç^ÈYH|×q°æì .
 rand( ) : Ç^¶ ó 0P 1§¡º (ñü )ÃÆÈ ; 0 <rand() <1.
£DÏÎÌÛæü w rand()çÆ_ l º seed,_hC¸õæ AWK{¡É ,
rand()çÆ£NÏÎP@Óº w º seed,Ó£ÍÃÆ .
 srand(x) : ü w H x° rand( )çÆ_ l º seed.
YÙ¤F x,h AWK|HõæɺéÁPÉ¡° rand()çÆ_ l º seed.

63
Appendix D Built-in Variables
]ºØÜƺÓÆ£h , ¹BöäÛö Ê Àþ¡ ú , üöärÀ¶ÇÆC .

ARGC í R OCW£Fïµ -F, -v, -f Îä Ò ï³ºÑƧ~º Ò ³ÑƺÓÆ .


YN \AWK{¡ "½µg ó R OCW , h ARGC ç£N Ó \{¡¡À "CJpâ
.
ARGV[ ] @Ó}CÎHOý R OCWºÑÆ .
Ò : õæUC R O
$ awk -Fnt -v a=8 -f prg.awk le1.dat le2.dat
Î
$ awk -Fnt -v a=8 'f print $1 * a g' le1.dat le2.dat
õæWCô@{¡á
ARGC = 3
ARGV[0] = "awk"
ARGV[1] = " le1.dat"
ARGV[2] = " le2.dat"
ªÌ Ð dß : í ARGC = 3 É , R OCWÈü w 2 Ó ê ÆÉ .
ù:
-Fnt íÜH tab °æìÀjr¸ FS( eld seporator).
-v a=8 OÎH initialize {¡¤ºÜÆ a.

FILENAME ÎHíÜØe¿bBzº ê ÆÉÉW .


FS æìÀjr¸ .
$0 íÜØe AWKÒ ªJº ê ÆC .
$1,$2.. ÀOíÜ Ò ªJº ê ÆC§Ä@æ , ÄGæ ,..(ÑÒUC¡ ú )
í AWKªJ@§ ê ÆC \A123 8:15" É , |ýH $0 O ü .
G $0 = "A123 8:15"
Y{¡¤i@BÏÎF $1, $2.. Î NF ¥ºØÜÆÉ , AWK~|ÛÊÀÎ $0.
HKúoæìÛöº ê Æ . ÁÎáUÓæìº ê Æ|ÀOH $1, $2, $3...©H
Oý .

64
AWKºw (default)º æìÀjr¸ (FS) ° ÅÕr¸ (Î tab).
H»ÒÓ¥ , ªÌY¼ïÜ FS, hÀÎá :
Ä@æ ($1)="A123", ÄGæ ($2)="8:15".
ÏÎÌiÎ Regexp Ûæ w q FS. AWKC¸ÝnÀÎ ê Æ CÉ , |ÑÒØe
FS§È .
Òp :
O FS = "[ :]+" íÜôóÑ ÅÕ " " Î ":" Ò Õ¨ºrê£ií¨À
j
r¸ , hÀÎá :
Ä@æ ($1) = "A123", ÄGæ ($2) = "8", ÄTæ ($3) = "15"

NR íq AWK } l õæ Ó {¡á Ò ªúº ê ÆCÆ .


FNR P NR \Îþü . £PºO AWKC}Ò@Ósº ê ÆÉ , FNR Kq 0 «s
Öp
NF íØeº ê ÆC Ò QÁÀºæìÆ .
AWK CªJ@§ ê Æá , ó {¡¤iH NF Óo¾ Ó § ê Æ]t ºæìÓ
Æ.
bU@§ ê ÆQªJ§e , NF ã|ïÜ . ýÏÎÌYÛæÏÎ $0ÓOý ê
Æ
Òp : ÏÎ getline, ¹É NF NNísº $0 W Ò O ü § ê ƺæìÓÆ .

OFS éXɺæìÀjr¸ . w]È " "(@ÓÅÕ ), Ô £U±¡ ú .


ORS éXÉ ê ÆCºÀjr¸ . w]È "nn"(õ æ ), £U±¡ ú .
OFMT ÆÈ ê ƺéXæ¡ . w]È "%.6g"(Y·nÉÌhLX 6ìpÆ )
íÏÎ print üO@¸LXhµ ê ÆÉ ,
Òp : print $1, $2
LX ê ÆÉ , AWK|ÛÊb $1 P $2 §¡ É W@Ó OFS §È (w]È° @Ó
ÅÕ )
C¸ÏÎ print éX (L )ê Æá , AWK|ÛÊ É W ORS §È .(w]È° õ æ )
ÏÎ print éX (L )ÆÈ ê ÆÉ , AWKNÄÎ OFMT §È°éXæ¡ .
Òp : print 2/3
AWK N|LX 0.666667
{¡¤iÇÑïÜoÇÜÆ§È , ÓïÜüO print ºéXæ¡ .

65
RS ( Record Separator) : AWKq ê ÆÉWªú ê ÆÉ , NÌ RS § wq â ê Æ
ÁΨ\h Records,Ó AWK@¸ÈªJ@Ó Record,HiæBz .
RS ºw]ÈO "nn". Ò H@ë AWK@¸ÈªJ@æ ê Æ .
³É @ Ó Recordt A F X C ê Æ (Multi-line Record). o¡ p U £ à A H
"nn" ÓÀjÖFº Records, iïÎ ÅÕæ ÓÀj .
b AWK{¡¤ ,O RS = "" íÜH ÅÕæ ÓÀjÖFº Records.
RSTART PÏÎrêçÆ match( )³ö§ÜÆ ,Ô £U±¡ ú .
RLENGTH PÏÎrêçÆ match( )³ö§ÜÆ .
íÏ Î Ì Ï Î match(...) çÆ á , AWK|N match(...) õæ º ² G H
RSTART,RLENGTH Oý§ .
Ð ÑÒ þý C AWKººØçÆ match().

SUBSEP (Subscript Separator) }C¤ùкÀjr¸ , w]È° "n034"


êÚW , AWK¤º }C uµü rê í¦ºùÐ , p : Arr["John"].
ýÏ Î Ì b AWK ¤´ i Ï Î Ær í} C º ù Ð , ÆÜ i Ï Î h û º } C
(Multi-dimenisional Array)
p : Arr[2,79]
ÆêW , AWKbµü Arr[2,79] §e , NwýâäùÐ૨rê "2n03479",
§áKH Arr["2n03479"] NÀ Arr[2,79].
iÑÒUÒ :
awk ' BEGIN f Arr[2,79] = 78
print Arr[2,79]
print Arr[ 2 , 79 ]
print Arr["2n03479"]
idx = 2 SUBSEP 79
print Arr[idx]
g
' $*
õæ²GLX :
78
78
78
78

66
Appendix E Regular Expression
 °°ònÏÎ Regular Expression
UNIX ¤£ÑF\h üO Î tools, ¦Ìã³bÉפ Mä (Search)rê Î m
« (Replace)rê º\à . ³ grep, vi , sed, awk,...
£ × OäMrê Î m «rê , £oý \iDoÇüO Ò näM (Q m « )ºrê°ó ".
Y¼ àwý ú T ¾ D Ò n äM (Q m « )ºrê °ó , u¾ Ó r êsb º d ò Î S x
É , Òp :
(@ ) äM \T0.c", \T1.c", \T2.c".... \T9.c" í¤ºô@rê .
(G ) äMÜÖsb@Ó \A"ºôNrê .
o¡pU , pói¾õæäMrêºüO Ò näMºrê°ó .
Ò (@ ) ¤ , näMô@b \T" P \.c" §¡sb@Óü Ô BÆrºrê ; í
MziHC|ºè¡ , @@â Ò näMºrêiDõæ R OºüO .
ýÒ (G ) ¤X ó Ó øóºrê³L­Øià , Õ²Lk@@C| . ¹É ,KÝ
nt@Ørêíܺèk (ó w ).

 °òO Regular Expression


Regular Expression(HU²Ù Regexp) O@ØrêíFºè¡ . iÎHüÙã
³YSxº Ò ³rê .
ù : °ÏO ó @ërê , »þý¤Ní Regexp ºrê§eÒ[ \Regexp".
ù : AWK {¡¤`H /..../Aí Regexp; HÏO ó @ërê .

Õ¨ Regular Expression º¸À


¶qr¸ £F . * [ ] + ? ( ) n ^ $ ~§ Ò ³r¸ .
Ѷqr¸ Ò Õ¨º RegexpäN q Pìrêr±N q ÛP .
Òp : Regexp \the" P@ërêº \the" NíÛPºN q .

67
. Metacharacter : ÎHNíôN@r¸ .
·dß UNIX Shell ¤ÏÎ \*"íÜ Wildcard, iÎHNíôNø×
ºrê . Ó Regexp ¤ÏÎ \." ÓNí@ÓôNr¸ .(`N : ÃDôN
ø׺rê )
Regexp ¤ \*" t³ä¦[N , ãNíôNø׺rê .

^ íÜ Ó rê²·X{ ó æº .
$ íÜ Ó rê²·X{ ó æ½ .
Òp :
Regexp /^The/ ÎHíÜ Ò ³X{ ó 溺rê "The".
Regexp /The$/ ÎHíÜ Ò ³X{ ó æ½rê "The".

n NSír¸Ùì¨r±N q ºr¸ (Escape character)


Regexp ¤Sír¸NQ Ñ À¨S w ºN q . YníÜSír¸ºr±
(literal meaning)Nq É ,bSír¸§e[W "n"Yi .
Òp :
ÏÎ RegexpÓíÜrê \a.out"É , £ig¨ /a.out/.
]° \."OSír¸ , íô@r¸ . iXG Regexp /a.out/ ºr
êN£u \a.out" @Ó ; rê \a2out", \a3out", \aaout" ...£
X ó Regexp /a.out/. ¿ T ºÎk° : /an.out/

[...] r¸°X , ÎHíÜâ¤A ¹ ¡ Ò ³ºr¸í¤ºô@Ó .


Òp : Regexp /[Tt]/ iÎHíÜr¸ \T" Î \t".
G Regexp /[Tt]he/ íÜ rê \The" Î \the".
r¸°X [... ] º£iHNdÅÕ .
Òp : Regexp /[ Tt ]/ ä¤A ¹ º³ÅÕr¸ , £íÜ \T", \t" ¤
ô@Ór¸ , ]iNí@Ó \ "(ÅÕr¸ )

- r¸°X¤iÏÎ \-" Óü w r¸ºÏ¡ , äÎkpU :


Regexp /[0-9]/ ¥ ó /[0123456789]/ ÎHíÜôN@Óü Ô BÆ
r.
Pz Regexp /[A-Z]/ ÎHíÜôN@Ójg^årÀ .
ý³dß :
68
1. Regexp /[0-9a-z]/ 㥠ó /[0-9][a-z]/; eÌ íÜ@Ór¸ ,
áÌíÜGÓr¸ .
2. Regexp /[-9]/ Î /[9-]/ uNír¸ \9"Î \-".
[^...] ÏÎ [^..] £Ír¸°Xº É ° (complement set).
äÎkpU :
Òp : nü w \T" Î \t" §~ºô@Ór¸ , iÎ /[^Tt]/ í§ .
Pz Regexp /[^a-zA-Z]/ íÜ^årÀ§~ºô@Ór¸ .
·dß \^" §ì m : \^"²·òµ ó \["§á , ~Nír¸°Xº É °
Òp : Regexp /[0-9^]/ uOÎHíÜ@Óü Ô BÆr Î r¸ "^".
* Îer¸« Æ ¸ÆºSír¸ .
\*" Îe ¦ eè § r ¸i X { 1 ¸ Î h ¸ , Î £ X { . Òp : Regexp
/T[0-9]*n.c/ ¤ * Îe ä e [0-9] (@Ó ü Ô B Æ r )X { º ¸Æ i °
0¸ Î h¸ .
G Regexp /T[0-9]*n.c/ iÎHíÜ \T.c", \T0.c", \T1.c"...\T9.c"
+ Îeäeºr¸X{@¸ Î @¸HW .
Òp : Regexp /[0-9]+/ ÎHíÜ@ì Î @ìHWºÆr .
? Îeäeºr¸iX{@¸ Î £X{ .
Òp : Regexp /[+-]?[0-9]+/ íÜÆr (@ìHW )§eiX{¿t
¹Î £X{¿t ¹ .
(...) ÎHAí@ s r¸ ,BN§ø¨@Ó group(£U±¡ ú )
Òp :
Regexp /12+/ íÜrê \12", \122", \1222", \12222",...
Regexp /(12)+/ íÜrê \12", \1212", \1212", \1212"....
W¡¤ 12 H ( ) Aí , G \+"Ò ÎeºO 12, « Æ X{º]O 12.

| íÜÞèWº "Î "(or)


Òp :
Regexp /Oranges?|apples?|water/ iÎHíÜ :
rê \Orange", \oranges" Î \apple", \apples" Î \water"
 match O°ò ?

Q × Regexp É , g `Jì \YrêX ó ( match )Y Regexp"ºr´ .


äNä° : \oÓ Regexp iQ Ñ À¨ Ó rê ".
69
Òp :
rê "the" X ó (match) Regexp /[Tt]he/.
]° Regexp /[Tt]he/ i Ñ À¨rê "the" Î "The", Grê "the" Î
"The" £X ó (match) Regexp /[Th]he/.
AWK ¤£ÑGÓöYBâ ¸ (Relational Operator,£ù@ ) ~ !~, ¦Ì]Ù
§° match, not match ýç q P@ë`Ùº match ¤³£P .
ä w q pU :
A í@rê , B í@ Regular Expression
un A rê¤sb³lrê i match( @ë w q º match) Regexp B , h
A ~ B Nâ¨ß , äÈ° true, ϧh° false.
!~ º w q P ~ ênÛÏ .
Òp:
"another" ¤t³lrê "the" i match Regexp /[Tt]he/ , Ò H
"another" ~ /[Tt]he/ §È° true.
ù @ : ³Ç × Û£âoâÓB⸠( ~, ~ )P Relational Operators k°@þ
.
 ³Î Regular Expression Ñ Dº²Ò
U±CX@dzΠRegular Expression º²Ò , ¡À d Ò¤|óÊ $0 §È , Y
zÏκ AWK £e\ÏÎÌóÊ $0É , Ð ïÎ gawk.
1. NÉפ Ò ³ºrê "Regular Expression" Î "Regular expression" «
¨ "Regexp"
awk '
{ gsub( /Regular[ \t]+[Ee]xpression/, "Regexp")
print
}
' $*

70
2. h£ÉפºÅÕæ (Î ÈtÅÕr¸ Î tab)
awk '
$0 !~ /^[ \t]*$/ { print }
' $*

3. bÉ ×¤Ñ³ ddd-dddd(q Ü ¹ X ¬A , d í digital)ºrêe [W "TEL :


"
awk '
{ gsub( /[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]/, "TEL : &" )
print
}
' $*

4. qÉ׺ Fullname ¤À÷X ô | P ÉW


awk '
BEGIN{
Fullname = "/usr/local/bin/xdvi"
match( Fullname, /.*\//)
path = substr(Fullname, 1, RLENGTH-1)
name = substr(Fullname, RLENGTH+1)
print "path :", path," name :",name
}
' $*
²GLX
path : /usr/local/bin name : xdvi

5. NY@ÆÈïH{÷íÜkí§ (ãÆ¡ÀCTì[@J ,BtGìpÆ )


awk '
BEGIN {
Number = 123456789
Number = sprintf("$%.2f",Number)
while( match(Number,/[0-9][0-9][0-9][0-9]/ ) )
sub(/[0-9][0-9][0-9][.,]/, ",&", Number)
print Number

}
' $*
²GLX
$123,456,789.00

71
6. âÉפ Ò ³ã \programÆr .f"ÎAºrêï° \[Ref : programÆr .c]"
awk '
{ while( match( $0, /program[0-9]+\.f/ ) ){
Replace = "[Ref : " substr( $0, RSTART, RLENGTH-2) ".c]"
sub( /program[0-9]+\.f/, Replace)
}
print
}
' $*

72
Index
n, 68 exit, 55
(...), 69 exp(), 63
*, 68, 69
+, 69 Field, 4
-, 68 eld variable, 6
-F, 64 FILENAME, 64
-f, 10, 26, 64 FNR, 65
-v, 64 for, 53
., 68 for( ... in ... ), 35, 53
?, 69 free memory allocation, 58
[...], 68 FS, 29, 64, 65
$, 68
$0, 6, 64 getline, 17, 23, 56
$1, 6, 64 if, 52
^, 68, 69 index, 13
f Actions g, 6, 9
~, 5, 11 index(), 60
int(), 63
>> , 22
> , 22 length(), 60
log(), 63
actions, 5 logical operators, 59
ARGC, 39, 64
ARGV, 39, 64 match, 11, 49, 69
arithmetic operators, 58 match(), 60
array, 13 next, 55
assignment operators, 59 NF, 7, 64
associative array, 13 not match, 11, 49, 69
atan2(), 63 NR, 7, 65
BEGIN, 22 OFMT, 65
break, 54 OFS, 65
Built-in variable, 25 ORS, 65
Built-in Variables, 7
close, 32, 57 pattern, 5
command line, 28 Pattern f Actions g, 11
comment, 25 pipe, 23, 58
compound pattern, 50 precedence, 59
conditional operator, 59 print, 9, 23, 56
continue, 55 printf, 10, 55
cos(), 63 rand(), 63
delete, 58 Record, 4
do-while, 53 regular expression, 50
relateion operator, 5
execute AWK, 5 relateional expression, 49

73
relational operators, 59
RLENGTH, 66
RS, 65
RSTART, 66
shell, 23
sin(), 63
sort, 23
split(), 61
sprintf(), 61
sqrt(), 63
srand(), 63
sub(), 61
SUBSEP, 66
substr(), 29, 62
system, 25, 58
system resource, 23
variable, 22
while, 53

74

Anda mungkin juga menyukai