¤¡ãs|pâ¤ß
ASPAC pº
Email: aspac@beta.wsl.sinica.edu.tw
ÞNøi : 94011
83 ~ 12 ë 5 é Version : 2.2
ASPAC pe©vn ú
1
1 Preface
³ö»âU :
oO@» AWKÇßüÞ , ä«IÛ« ó :
AWK A óÑ MþÇÝD ?
AWK `£º Ñ DÒ¡°ó ?
ªÌ 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
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¶Ð .
»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"°Ò ,
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 ºæìÜÆ
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º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 ÓïÜ ê Ææ¡ .
9
4. print ° AWKÒ £Ñº éXüO , |N ê ÆéX ì stdout(Ãõ ). print ºÑ
Æ¡ ¼ ¹H \," j} , LX ê ÆÉ ¼ ¹¡|HÅÕj} .
(ÑÒ þý D ºØÜÆ OFS)
õæ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 .
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 .
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
¡ú:
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 :
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º ê ÆìÉ×½Ý ).
ØßpUÉ×ÃúW° reformat1.awk
BEGIN f print \ ID Number Arrival Time" > \today rpt1"
print \==========================="> \today rpt1"
g
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õæ .
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¨ .
À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 \@¸ ".
Øß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
õæpU R O :
$ awk -f reformat2.awk arr.dat
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 datale ". script ¤Ù
i]tä¦ Shell R O , p¹óiW[õæL{ºÛÊÆ .
Øß@Ó²æº AWK{¡ mydump.awk , pU :
f print g
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 .
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
ù~ .
28
7.4 Changing Field Separator & User Dene Functions
AWK£ÈàÛÊÀÎæì , ]¹\ ÏÎÌïÜäæì ÁÎè¡HA³U Ø桧
Ýn . ÏÎÌ]iÛ w çÆ , Y³ÝniN Ó çÆæWg¨@ÓÉ× ,HÑä¦ AWK{¡
sÎ .
À 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 )
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)
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. latele O@ÜÆ , ÎHOýðì¸ ÆºÉקÉW . latele §ÈÑâ¡ Àc¨
, eb¡Oíëë÷WÙ (Ñ I s "date"úo ) áb¡ Tw ° "late.dat" p : Jun-
late.dat .
2. üO getline < latele íÑ latele Ò 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] > latele
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
Jù
mathematica
õpØ
AWK Tutorial Guide
Regular Expression
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ù "
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 Ò .
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
²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ÏÎ .
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
45
s èpUº AWK¡ , úW° permu
awk '
BEGINf
print "Ð éJÆCº¸À ,U¸À¡ Ð ÎÅÕj} "
getline
permutation( $0, "")
printf("nn@ %d ØÆCè¡ nn", counter)
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.
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 } .....
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)
}
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É× datale ¤ªú ê Æ , í $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" }
3. AWK À ñÒ ûκOÐéºüO
AWK {¡¤`ÏÎ}C (Array)ÓOÐjq ê Æ . delete üOKOÎÓÀ ñ }
C¤º¸À ÒÒ ûκOÐÅ¡ .
dÒ:
for( any in X_arr )
delete X_arr[any]
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)
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 .
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"
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().
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 ).
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".
70
2. h£ÉפºÅÕæ (Î ÈtÅÕr¸ Î tab)
awk '
$0 !~ /^[ \t]*$/ { print }
' $*
}
' $*
²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