ÀÕÚÛÐÜÐ: |
awk |
´ÐÝÝÐï áâÐâìï ÑëÛÐ Ø×ÝÐçÐÛìÝÞ ÝÐߨáÐÝÐ
ÔÛï www.nevod.ru |
Ϸ˺ ¾±À°±¾Âº¸ Ȱ±»¾½¾² awk (Aho, Weinberg, Kernigan) awk - ÚÞÜÐÝÔÐ ÚÞÝâÕÚáâÝÞÓÞ ßÞØáÚÐ Ø ßàÕÞÑàÐ×ÞÒÐÝØï âÕÚáâÐ. ¾ÝÐ - äØÛìâà. µÕ ÜÞÖÝÞ àÐááÜÐâàØÒÐâì ÚÐÚ ÞÑÞÛÞçÚã "awk" Ò ÞÑÞÛÞçÚÕ "shell". 1. ÁÂÀúÂÃÀ° awk-¿À¾³À°¼¼Ë ¿àÞÓàÐÜÜÐ áÞáâÞØâ Ø× ÞßÕàÐâÞàÞÒ (ßàÐÒØÛ), ØÜÕîéØå ÒØÔ: èÐÑÛÞÝ {ÔÕÙáâÒØÕ} èÐÑÛÞÝ {ÔÕÙáâÒØÕ} . . . ÇÐáâÝëÕ áÛãçÐØ: {ÔÕÙáâÒØÕ} - ÚÞÓÔÐ ÔÕÙáâÒØÕ ÒëßÞÛÝïÕâáï ÔÛï ÒáÕå áâàÞÚ. èÐÑÛÞÝ - ÚÞÓÔÐ ÒëÒÞÔïâáï áâàÞÚØ á ÔÐÝÝëÜ èÐÑÛÞÝÞÜ. ´ÕÙáâÒØÕ ÜÞÖÕâ áÞáâÞïâì Ø× ßÞáÛÕÔÞÒÐâÕÛìÝÞáâØ ÞßÕàÐâÞàÞÒ, àÐ×ÔÕÛïÕÜÞÙ ";" ØÛØ ßÕàÕÒÞÔÞÜ áâàÞÚØ ØÛØ ×ÐÚàëÒÐîéÕÙ áÚÞÑÚÞÙ. ²Þ×ÜÞÖÝë ÚÞÜÜÕÝâÐàØØ (ÚÐÚ Ò shell "#........."). ¿àØÜÕà: ´Ûï ÔÐÛìÝÕÙèØå ßàØÜÕàÞÒ ÒÞ×ìÜÕÜ ÒåÞÔÝÞÙ äÐÙÛ "f-awk" ( äÐÜØÛØï ØÝØæØÐÛë ÓÞÔ-ßàØÕÜÐ-ÝÐ-àÐÑÞâã ÒÞ×àÐáâ ): ¸ÒÐÝÞÒ ¸.¸. 1980 50 ¿ÕâàÞÒ °.². 1979 40 ÁØÔÞàÞÒ Á.º. 1979 40 ÅÒÕÔÞàÞÒ ¸.Å. 1970 60 awk '{print}' f-awk # ÒëÔÐÕâ ÒÕáì âÕÚáâ; echo awk '/ÔÞ/ {print}' f-awk # ÒëÔÐÕâ áâàÞÚØ, ÓÔÕ Õáâì "ÔÞ". echo awk '/ÔÞ/ {}' f-awk # ÒëÔÐÕâ áâàÞÚØ, ÓÔÕ Õáâì "ÔÞ" echo awk '/ÔÞ/ {print("¿àØÒÕâ!")}' f-awk ÀÕ×ãÛìâÐâ: ¸ÒÐÝÞÒ ¸.¸. 1980 50 ¿ÕâàÞÒ °.². 1979 40 ÁØÔÞàÞÒ Á.º. 1979 40 ÅÒÕÔÞàÞÒ ¸.Å. 1970 60 ÁØÔÞàÞÒ Á.º. 1979 40 ÅÒÕÔÞàÞÒ ¸.Å. 1970 60 ÁØÔÞàÞÒ Á.º. 1979 40 ÅÒÕÔÞàÞÒ ¸.Å. 1970 60 ¿àØÒÕâ! ¿àØÒÕâ! ÁãéÕáâÒãÕâ ÔÒÐ ÞßÕàÐâÞàÐ áßÕæØÐÛìÝÞÓÞ ÒØÔÐ ("BEGIN"- ÝÐçÐÛìÝëÕ ãáâÐÝÞÒÚØ Ø "END" - "ßÞáÛÕÔÕÙáâÒØï"): BEGIN {ÔÕÙáâÒØÕ} èÐÑÛÞÝ {ÔÕÙáâÒØÕ} èÐÑÛÞÝ {ÔÕÙáâÒØÕ} . . . END {ÔÕÙáâÒØÕ} 2. ²Ë·¾² awk ²Þ×ÜÞÖÝë ÔÒÐ ÞáÝÞÒÝëå ÒÐàØÐÝâÐ: 1) awk [-Fc] 'prog.awk' [files] ÍâÞ ßàÞáâÕÙèØÙ áÛãçÐÙ, ÚÞÓÔÐ ßàÞÓàÐÜÜÐ (×ÐÚÛîçÕÝÝÐï Ò ÚÐÒëçÚØ " ' ") ÝÐåÞÔØâáï Ò âÕÛÕ ÚÞÜÐÝÔë, "-Fc" - äÛÐÓ, ÜÕÝïîéØÙ áâÐÝÔÐàâÝëÙ àÐ×ÔÕÛØâÕÛì ßÞÛÕÙ ÝÐ "c" "file" - ØÜï äÐÙÛÐ ØáåÞÔÝëå ÔÐÝÝëå, ßàØ ÕÓÞ ÞâáãâáâÒØØ - áÞ áâÐÝÔÐàâÝÞÓÞ ÒåÞÔÐ. (ÍâÞâ äÞàÜÐâ ØáßÞÛ×ÞÒÐÝ Ò ÝÐçÐÛìÝëå ßàØÜÕàÐå). cat f-awk | awk '/ÔÞ/ {print}' Ø awk '/ÔÞ/ {print}' < f-awk ÔÐîâ àÕ×ãÛìâÐâ, ÐÝÐÛÞÓØçÝëÙ awk '/ÔÞ/ {print}' f-awk ´Ûï ÔÕÜÞÝáâàÐæØØ ÔÕÙáâÒØï äÛÐÓÐ "-Fc" àÐááÜÞâàØÜ Òë×ÞÒë: awk '/ÔÞ/ {print($2)}' f-awk awk -F0 '/ÔÞ/ {print($2)}' f-awk ½Ð íÚàÐÝ ÑãÔÕâ ÒëÒÕÔÕÝÞ: Á.º. ¸.Å. 6 ¿ÕàÒÐï ÚÞÜÐÝÔÐ "awk" ÒëÒÕÔÕâ ÒâÞàëÕ ßÞÛï (ÑÛÐÓÞÔÐàï ßÞרæØÞÝÝÞÙ ßÕàÕÜÕÝÝÞÙ "$2") áâàÞÚ, áÞÔÕàÖÐéØÕ "ÔÞ". (ºáâÐâØ, ßÞרæØÞÝÝÐï ßÕàÕÜÕÝÝÐï "$0" áÞÞâÒÕâáÒãÕâ ÒáÕÙ áâàÞÚÕ). ²Þ ÒâÞàÞÜ áÛãçÐÕ, ÑÛÐÓÞÔÐàï äÛÐÓã "-F" áâÐÝÔÐàâÝëÕ àÐ×ÔÕÛØâÕÛØ ×ÐÜÕÝÕÝë ÝÐ áØÜÒÞÛ "0", â.Õ. âÕßÕàì ÒëÑàÐÝÝëÕ áâàÞÚØ ÒÞáßàØÝØÜÐîâáï, ÚÐÚ àÐ×ÑØâëÕ ÝÐ áÛÕÔãîéØÕ ßÞÛï: ÁØÔÞàÞÒ Á.º. 1979 40 ---------------------^-------------------- 1-Õ ßÞÛÕ 2-Õ ßÞÛÕ (ßãáâÞ) ÅÒÕÔÞàÞÒ ¸.Å. 1970 60 -----------------^---^-------------------- 1-Õ ßÞÛÕ 2-Õ 3-Õ ßÞÛÕ (ßãáâÞ) 2) awk [-Fc] -f prog.awk [files] ÄÛÐÓ "-f" ÓÞÒÞàØâ Þ âÞÜ, çâÞ awk-ßàÞÓàÐÜÜã ÝÐÔÞ ÑàÐâì Ø× äÐÙÛÐ, ØÜï ÚÞâÞàÞÓÞ ãÚÐ×ÐÝÞ áÛÕÔÞÜ (ØÜï ÜÞÖÕâ Ñëâì ßàÞØ×ÒÞÛìÝëÜ Ø àÐáèØàÕÝØÕ ".awk" ÔÞÑÐÒÛÕÝÞ ×ÔÕáì ßàÞáâÞ Ø× íáâÕâØçÕáÚØå áÞÞÑàÐÖÕÝØÙ). 3. awk-¿µÀµ¼µ½½Ëµ ¸ ²ËÀ°¶µ½¸Ï ² ï×ëÚÕ awk ÒëÔÕÛïîâáï ÔÒÕ Óàãßßë ßÕàÕÜÕÝÝëå: ßàÕÔÞßàÕÔÕÛÕÝÝëÕ Ø ÔÕÚÛÐàØàÞÒÐÝÝëÕ Ò ßàÞÓàÐÜÜÕ. ¸áåÞÔÝëÕ ×ÝÐçÕÝØï ßàÕÔÞßàÕÔÕÛÕÝÝëå ßÕàÕÜÕÝÝëå ãáâÐÝÐÒÛØÒÐîâáï ØÝâÕàßàÕâÐâÞàÞÜ awk Ò ßàÞæÕááÕ ×ÐßãáÚÐ Ø ÒëßÞÛÝÕÝØï awk-ßàÞÓàÐÜÜë. º ßàÕÔÞßàÕÔÕÛÕÝÝëÜ ÞâÝÞáïâáï: ÃÜÞÛçÐÝØï: NR ÝÞÜÕà âÕÚãéÕÙ áâàÞÚØ; NF çØáÛÞ ßÞÛÕÙ Ò âÕÚãéÕÙ áâàÞÚÕ; RS àÐ×ÔÕÛØâÕÛì áâàÞÚ ÝÐ ÒÒÞÔÕ; "\0" FS àÐ×ÔÕÛØâÕÛì ßÞÛÕÙ ÝÐ ÒÒÞÔÕ; ßàÞÑÕÛ Ø/ØÛØ âÐÑãÛïæØï ORS àÐ×ÔÕÛØâÕÛì áâàÞÚ ÝÐ ÒëÒÞÔÕ; RS OFS àÐ×ÔÕÛØâÕÛì ßÞÛÕÙ ÝÐ ÒëÒÞÔÕ; FS OFMT äÞàÜÐâ ÒëÒÞÔÐ çØcÛ; "%.6g" FILENAME ØÜï ÒåÞÔÝÞÓÞ äÐÙÛÐ. ¿àÞçØÜ ßÕàÕÜÕÝÝëÜ ßÞÛì×ÞÒÐâÕÛì ÜÞÖÕâ ßàØáÒÐØÒÐâì ÝÐçÐÛìÝëÕ ×ÝÐçÕÝØï. ¿Þ ãÜÞÛçÐÝØî "0" ØÛØ ßãáâÐï áâàÞÚÐ (çâÞ ×ÔÕáì àÐÒÝÞ×ÝÐçÝÞ!). ÂØßë ßÕàÕÜÕÝÝëå: - ßÞרæØÞÝÝëÕ, - çØáÛÐ á ßÛÐÒÐîéÕÙ âÞçÚÞÙ, - áâàÞÚÐ áØÜÒÞÛÞÒ, - ÜÐááØÒ. ¸ÝâÕàßàÕâÐâÞà awk àÐááÜÐâàØÒÐÕâ ßÕàÕÜÕÝÝãî ÚÐÚ áâàÞÚÞÒãî, ßÞÚÐ ÝÕ ÒÞ×ÝØÚÐÕâ ÝÕÞÑåÞÔØÜÞáâì ÒëßÞÛÝØâì ÞßÕàÐæØØ: - ÕáÛØ ßàÞÑÕÛ (ÚÞÝÚÐâÕÝÐæØï), âÞ áâàÞÚØ; - ÕáÛØ "+", âÞ çØáÛÐ á ßÛÐÒÐîéÕÙ âÞçÚÞÙ. ¿àØÜÕàë: awk '{a = $3 $4; print a}' f-awk awk '{a = $3+$4; print a}' f-awk ÀÕ×ãÛìâÐâ: 198050 197940 197940 197060 2030 2019 2019 2030 awk '{} END {a = 2 + 2 ; print a}' < f-awk awk '{} END {a = 2 + "2" ; print a}' < f-awk awk '{} END {a = 2 + "ÔÒÐ" ; print a}' < f-awk awk '{} END {a = "ÔÒÐ"+"ÔÒÐ" ; print a}' < f-awk awk '{} END {a = 2.2 + 2.000 ; print a}' < f-awk ÀÕ×ãÛìâÐâ: 4 4 2 0 4.2 ¼ÐááØÒ ÝÕ ÞÑ'ïÒÛïÕâáï, Ð ÝÐçØÝÐÕ áãéÕáâÒÞÒÐâì Ò ÜÞÜÕÝâ ßÕàÒÞÓÞ ØáßÞÛì×ÞÒÐÝØï. ¸ÝÔÕÚá ÜÐááØÒÐ - ÛîÑÞÕ ÝÕÝãÛÕÒÞÕ ×ÝÐçÕÝØÕ ØÛØ áâàÞÚÐ. ¼ÐááØÒë ÐááÞæØÐâØÒÝëÕ, â.Õ. ÝÕ ßÞ ÒëçØáÛïÕÜÞÜã ØÝÔÕÚáã, Ð ßÞ áÞÒßÐÔÕÝØî áÞÔÕàÖÐÝØï, ÝÐßàØÜÕà: day [Jan][31] = Mon day [Feb][01] = Tue day [Feb][02] = Wed ¼ÐááØÒë ãÔÞÑÝÞ ØáßÞÛì×ÞÒÐâì ßàØ áãÜÜØàÞÒÐÝØïå, ÝÐßàØÜÕà ×ÐßØáØ ÒëßÛÐâ ØÜÕîâ ÒØÔ (äÐÙÛ "p-1"): John 100 Mary 200 Mary 200 John 100 John 300 awk '{sum[$1] += $2; print $1 sum[$1]} ' < p-1 ÀÕ×ãÛìâÐâ (ßÞØÜÕÝÝëÙ ÝÐàÐáâÐîéØÙ ØâÞÓ): John100 Mary200 Mary400 John200 John500 ¾ßÕàÐæØØ ÚÐÚ Ò ÁØ: =, +=, -=, *=, /=, %=, +, /, %, ++, --. ÁàÐÒÝÕÝØï çØáÕÛ, ÕáÛØ ÞÑÐ çØáÛÐ, ØÝÐçÕ - áâàÞÚ: <, <=, ==, !=, >=, > »ÞÓØçÕáÚØÕ ÞßÕàÐæØØ: !, ||, && ¾ßÕàÐæØï "ßàÞÑÕÛ" - ÚÞÝÚÐâÕÝÐæØï. 4. ¿À¸¼µÀË awk-¿À¾³À°¼¼ 1) awk '{print ($2, $3)}' f-awk ÀÕ×ãÛìâÐâ: ¸.¸. 1980 °.². 1979 Á.º. 1979 ¸.Å. 1970 2) awk '/Õ/ {print ($2, $3)}' f-awk ÀÕ×ãÛìâÐâ: °.². 1979 ¸.Å. 1970 3) awk '/Õ/ {print ($1, 2000 - $3)}' f-awk ÀÕ×ãÛìâÐâ: ¿ÕâàÞÒ 21 ÅÒÕÔÞàÞÒ 30 4) awk '{ s = s + $4} END {print ("ÁãÜÜÐàÝëÙ ÒÞ×àÐáâ:" s) print ("ÁàÕÔÝØÙ ÒÞ×àÐáâ:" s/NR)}' f-awk ÀÕ×ãÛìâÐâ: ÁãÜÜÐàÝëÙ ÒÞ×àÐáâ:190 ÁàÕÔÝØÙ ÒÞ×àÐáâ:47.5 5) awk '{ s += $4 } {print("NR="NR, "NF="NF)} END {print ("FILENAME=" FILENAME) print ("·ÝÐçÕÝØÕ ßÞרæØÞÝÝÞÙ ßÕàÕÜÕÝÝÞÙ" $4 "\"ßãáâÞ\" \ ßÞáÛÕ ÞÚÞÝçÐÝØï ßàÞáÜÞâàÐ)") print ("ÁãÜÜÐàÝëÙ ÒÞ×àÐáâ:" s) print ("ÁàÕÔÝØÙ ÒÞ×àÐáâ:" s/NR)}' f-awk ÀÕ×ãÛìâÐâ: NR=1 NF=4 NR=2 NF=4 NR=3 NF=4 NR=4 NF=4 FILENAME=f-awk ·ÝÐçÕÝØÕ ßÞרæØÞÝÝÞÙ ßÕàÕÜÕÝÝÞÙ"ßãáâÞ" ßÞáÛÕ ÞÚÞÝçÐÝØï ßàÞáÜÞâàÐ) ÁãÜÜÐàÝëÙ ÒÞ×àÐáâ:190 ÁàÕÔÝØÙ ÒÞ×àÐáâ:47.5 5. Áµ»µºÂ¾ÀË ·ÔÕáì "áÕÛÕÚâÞà" áÛÕÔãÕâ ßÞÝØÜÐâì, ÚÐÚ àÐáèØàÕÝØÕ ßÞÝïâØï "èÐÑÛÞÝ", ßÞáÚÞÛìÚã âÐÜ ÓÔÕ Ò áâàãÚâãàÕ ÚÞÜÐÝÔë ãÚÐ×ÐÝ èÐÑÛÞÝ, Ò ÞÑéÕÜ áÛãçÐÕ ÜÞÖÕâ áâÞïâì ÛîÑÞÙ áÕÛÕÚâÞà. ·°¼µÇ°½¸µ. ¾âÚàëÒÐîéÐï áÚÞÑÚÐ ÔÕÙáâÒØï "{" ÔÞÛÖÝÐ Ñëâì Ò áâàÞÚÕ áÕÛÕÚâÞàÐ. ² ÚÐçÕáâÒÕ áÕÛÕÚâÞàÐ ÜÞÖÕâ Ñëâì: 1) ÒëàÐÖÕÝØÕ; 2) èÐÑÛÞÝ; 3) Øå ÚÞÜÑØÝÐæØï. ÁÞÞâÒÕâáÒãîéØÕ ßàØÜÕàë: 1) $3 != $4 && $3 > 1970 $3 % 2 == 1 $1=="¸ÒÐÝÞÒ" - ÚÐÒëçÚØ, çâÞÑë ÒÞáßàØÝØÜÐÛÞáì, ÚÐÚ áâàÞÚÐ. 2) /ab/ ÞâÛØçÝÞ Þâ /a b/, / ab/ Ø /ab / NßÞÛï ^èÐÑÛÞÝ - ßÞ áÞÒßÐÔÕÝØî NßÞÛï !^èÐÑÛÞÝ - ßÞ ÝÕáÞÒßÐÔÕÝØî ¿àØÜÕà: awk '$3~0 {print} ' < f-awk echo awk '$3!~0 {print} ' < f-awk ¸ÒÐÝÞÒ ¸.¸. 1980 50 ÅÒÕÔÞàÞÒ ¸.Å. 1970 60 ¿ÕâàÞÒ °.². 1979 40 ÁØÔÞàÞÒ Á.º. 1979 40 3) ÈÐÑÛÞÝ ÜÞÖÕâ äÞàÜØàÞÒÐâì ÜÝÞÖÕáâÒÞ ÞÑàÐ׿ÞÒ ØÛØ ãÚÐ×ëÒÐâì, Ò ÚÐÚÞÜ ÜÕáâÕ ßÞÛï ØáÚÐâì: /^a/ - ßÞÛÕ ÝÐçØÝÐÕâáï á "a" /a$/ - ßÞÛÕ ÚÞÝçÐÕâáï "a" \+ - íÚàÐÝØàãÕâ ÞßÕàÐâÞà [abc] - ÛîÑÞÙ Ø× áØÜÒÞÛÞÒ "a", "b" Ø "c" [a-à] - ÛîÑÞÙ áØÜÒÞÛ ÔØÐßÐ×ÞÝÐ * - 0 ØÛØ ÑÞÛìèÕ ÒåÞÖÔÕÝØÙ àÕÓãÛïàÝÞÓÞ ÒëàÐÖÕÝØï + - 1 ØÛØ ÑÞÛìèÕ ÒåÞÖÔÕÝØÙ àÕÓãÛïàÝÞÓÞ ÒëàÐÖÕÝØï ? - 0 ØÛØ 1 ÒåÞÖÔÕÝØÕ àÕÓãÛïàÝÞÓÞ ÒëàÐÖÕÝØï ab|cd - "ab" ØÛØ "cd" ¿àØÜÕàë áÞçÕâÐÝØÙ: awk ' $3~/(7[0-9])$/ {print} ' f-awk ÀÕ×ãÛìâÐâ: ¿ÕâàÞÒ °.². 1979 40 ÁØÔÞàÞÒ Á.º. 1979 40 ÅÒÕÔÞàÞÒ ¸.Å. 1970 60 ÂÞ Õáâì Ò âàÕâìÕÜ ßÞÛÕ ÒëÔÕÛØâì 70-Õ ÓÞÔë (7 Ø ÕéÕ ÞÔÝÐ æØäàÐ Þâ ÚÞÝæÐ ßÞÛï). 6. µÉµ ¿À¸¼µÀË 1) awk '$1=="¸ÒÐÝÞÒ" {print} ' f-awk ÀÕ×ãÛìâÐâ: ¸ÒÐÝÞÒ ¸.¸. 1980 50 2) awk '$4/2==30 {print} ' f-awk ÀÕ×ãÛìâÐâ: ÅÒÕÔÞàÞÒ ¸.Å. 1970 60 3) awk '$3 != $4 && $3 > 1970 {print} ' f-awk ÀÕ×ãÛìâÐâ: ¸ÒÐÝÞÒ ¸.¸. 1980 50 ¿ÕâàÞÒ °.². 1979 40 ÁØÔÞàÞÒ Á.º. 1979 40 4) awk '$1~/ÝÞÒ$/ {print} ' f-awk ÀÕ×ãÛìâÐâ: ¸ÒÐÝÞÒ ¸.¸. 1980 50 5) awk '/^¸Ò|ÔÞà/ {print} ' f-awk ÀÕ×ãÛìâÐâ: ¸ÒÐÝÞÒ ¸.¸. 1980 50 ÁØÔÞàÞÒ Á.º. 1979 40 ÅÒÕÔÞàÞÒ ¸.Å. 1970 60 6) awk '/1980/,/1979/ {print} ' f-awk ÀÕ×ãÛìâÐâ: ¸ÒÐÝÞÒ ¸.¸. 1980 50 ¿ÕâàÞÒ °.². 1979 40 7. ´µ¹Á²¸Ï ² awk ÒÞ×ÜÞÖÝë áÛÕÔãîéØÕ ÔÕÙáâÒØï: 1) ßàØáÒÐØÒÐÝØï ÒëàÐÖÕÝØÙ; 2) ÞßÕàÐâÞàë ãßàÐÒÛÕÝØï 3) ÞßÕàÐâÞàë ÒëÒÞÔÐ; 4) ÒáâàÞÕÝÝëÕ äãÝ򾯯. ¾¿µÀ°Â¾ÀË Ã¿À°²»µ½¸Ï ¿àÞáâÕÙèØÕ ÞßÕàÐâÞàë exit - ×ÐÒÕàèØâì ÒëßÞÛÝÕÝØÕ ßàÞÓàÐÜÜë; next - ßÕàÕÙâØ Ú áÛÕÔãîéÕÙ áâàÞÚÕ, ãßàÐÒÛÕÝØÕ ÝÐ ÝÐçÐÛÞ awk-ßàÞÓàÐÜÜë; break - ÒëåÞÔ Ø× æØÚÛÐ; continue - ßÕàÕåÞÔ Ú áÛÕÔãîéÕÙ ØâÕàÐæØØ; ÁâàãÚâãàÝëÕ ÞßÕàÐâÞàë if (ãáÛÞÒØÕ) {ÞßÕàÐâÞàë} [else {ÞßÕàÐâÞàë}] while (ãáÛÞÒØÕ) {ÞßÕàÐâÞàë} for (ÒëàÐÖÕÝØÕ; ãáÛÞÒØÕ; ÒëàÐÖÕÝØÕ) {ÞßÕàÐâÞàë} for (ØÝÔÕÚá in ØÜï_ÜÐááØÒÐ) {ÞßÕàÐâÞàë} ÁâàãÚâãàÝëÕ ÞßÕàÐâÞàë Ò ×ÝÐçØâÕÛìÝÞÙ áâÕßÕÝØ ÐÝÐÛÞÓØçÝë áÞÞâÒÕâáÒãîéØÜ ÞßÕàÐâÞàÐÜ ÁØ. ² ßÞáÛÕÔÝÕÜ áÛãçÐÕ ÔÛï ÚÐÖÔÞÓÞ ØÝÔÕÚáÐ ÒëßÞÛÝïÕâáï ÑÛÞÚ. ÂÕÚáâÞÒëÕ ØÝÔÕÚáë àÐááÜÐâØàÒÐîâáï Ò ÛÕÚáØÚÞÓàÐäØçÕáÚÞÜ ßÞàïÔÚÕ. ¿àØÜÕàë 1) awk ' $4~/40/ {if($3<=1980) {print("ÄÐÜØÛØï: " $1 ) M["40"]++}} $4~/50/ {M["50"]++} END {for(i in M) {print(" i =" i " M[" i "]=" M[i])}} ' f-awk ÀÕ×ãÛìâÐâ: ÄÐÜØÛØï: ¿ÕâàÞÒ ÄÐÜØÛØï: ÁØÔÞàÞÒ i =40 M[40]=2 i =50 M[50]=1 2) awk ' BEGIN {ORS = " "} { for(k=NF; k>0; --k) {print $k} {print RS} } ' f-awk | sed 's/^ //' ÀÕ×ãÛìâÐâ: 50 1980 ¸.¸. ¸ÒÐÝÞÒ 40 1979 °.². ¿ÕâàÞÒ 40 1979 Á.º. ÁØÔÞàÞÒ 60 1970 ¸.Å. ÅÒÕÔÞàÞÒ ·ÔÕáì, ÚàÞÜÕ Ø×ÜÕÝÕÝØï ÞçÕàÕÔÝÞáâØ ßÞÛÕÙ Ò áâàÞÚÕ ÝÐ ßàÞâØÒÞßÞÛÞÖÝÞÕ (çâÞ ÔÕÛÐÕâ æØÚÛ "for"), ßàÕÔÒÐàØâÕÛìÝÞ ãáâÐÝÐÒÛØÒÐÕâáï ÒëåÞÔÝÞÙ àÐ×ÔÕÛØâÕÛì - ßàÞÑÕÛ Ø ÒÕáì àÕ×ãÛìâÐâ ßàÕÔÒÐàØâÕÛìÝÞ ÒëÔÐÕâáï Ò ÞÔÝã áâàÞÚã, ßÞíâÞÜã ßÞáÛÕ ÞÑàÐÑÞâÚØ ÚÐÖÔÞÙ áâàÞÚØ ÒëÔÐÕâáï ÚÞÜÐÝÔÐ "print RS" ÔÛï ßÕàÕÒÞÔÐ ÒëåÞÔÝÞÙ áâàÞÚØ. ÀÕÔÐÚâÞà "sed" ßÞÔÚÛîçÕÝ çÕàÕ× ÚÞÝÒÕÙÕà, çâÞÑë ãÑàÐâì ÒÞ×ÜÞÖÝëÕ ßàÞÑÕÛë Ò ÝÐçÐÛÕ áâàÞÚØ. ÁãéÕáâÒÕÝÝÐï ÔÕâÐÛì. µáÛØ ×ÐßãáâØâì ÛØèì ÑÐ×ÞÒãî áâàãÚâãàã awk '{ for(k=NF; k>0; --k) {print $k}}' f-awk âÞ ÒáÕ ßÞÛï ØáåÞÔÝÞÙ âÐÑÛØæë á Ø×ÜÕÝÕÝØïÜØ ßÞàïÔÚÐ ÒÝãâàØ ßàÕÖÝØå áâàÞÚ ßÞÛãçØÜ ÒëâïÝãâëÜØ Ò ÞÔØÝ áâÞÛÑÕæ ßÕàÕÒÞÔÞÜ áâàÞÚØ: 50 1980 ¸.¸. ¸ÒÐÝÞÒ 40 1979 °.². ¿ÕâàÞÒ 40 1979 Á.º. ÁØÔÞàÞÒ 60 1970 ¸.Å. ÅÒÕÔÞàÞÒ ¾ÔÝÐÚÞ, ÕáÛØ ßÞáâÐÒØÜ ";" áàÐ×ã ßÞáÛÕ ãáÛÞÒØï, â.Õ. áÔÕÛÐÕÜ ßãáâÞÕ âÕÛÞ æØÚÛÐ, ×Ð ßàÕÔÕÛë ÚÞâÞàÞÓÞ ÒëÝÕáÕÝ "print $k" awk '{ for(k=NF; k>0; --k); {print $k}}' f-awk âÞ ßÞÛãçØÜ ØáåÞÔÝãî âÐÑÛØæã ¸ÒÐÝÞÒ ¸.¸. 1980 50 ¿ÕâàÞÒ °.². 1979 40 ÁØÔÞàÞÒ Á.º. 1979 40 ÅÒÕÔÞàÞÒ ¸.Å. 1970 60 ßÞáÚÞÛìÚã "$k" ßÞáÛÕ ÒëåÞÔÐ Ø× æØÚÛÐ ÑãÔÕâ ØÜÕâì ×ÝÐçÕÝØÕ "0", Ð "$0" - áÞÞâÒÕâáÒãÕâ ÒáÕÙ áâàÞÚÕ Ò ÚÐçÕáâÒÕ ×ÝÐçÕÝØï(!), âÞ "print $k" ÑãÔÕâ ßÞáÛÕ ÚÐÖÔÞÓÞ æØÚÛÐ ßÕçÐâÐâì ßÞÛÝëÕ áâàÞÚØ. 8. ²²¾´ ¸ ²Ë²¾´ ´°½½ËÅ ² ÞÑéÕÜ áÛãçÐÕ Ò ÚÞÜÐÝÔÕ awk ÜÞÖÕâ Ñëâì ãÚÐ×ÐÝÞ ÝÕáÚÞÛìÚÞ äÐÙÛÞÒ. ½ÐßÞÜÝØÜ äÞàÜÐâë Òë×ÞÒÐ ÚÞÜÐÝÔë: awk [-Fc] 'prog.awk' [file ...] awk [-Fc] -f prog.awk [file ...] ^ ÄÐÙÛë ÞÑàÐÑÐâëÒÐîâáï ßÞáÛÕÔÞÒÐâÕÛìÝÞ Ò ãÚÐ×ÐÝÝÞÜ ßÞàïÔÚÕ. ÍâÞ ÜÞÖÝÞ ØáßÞÛì×ÞÒÐâì ÔÛï "ÝÐáâàÞÙÚØ" awk ÚÞÜÐÝÔë ßàØ ÞÑàÐÑÞâÚÕ ßÞáÛÕÔãîéØå äÐÙÛÞÒ. ¿ãáâì äÐÙÛ "f0" ØÜÕÕâ ÒØÔ: 60 ÁØÔÞàÞÒ ° äÐÙÛ awk-ßàÞÓàÐÜÜë "prim.awk" ØÜÕÕâ ÒØÔ: FILENAME == "f0" { # ÕáÛØ ßàÞáÜÐâàØÒÐÕâáï äÐÙÛ "f0" w1 = $2 # ßàØáÒÐØÒÐîâáï ×ÝÐçÕÝØï ßÕàÕÜÕÝÝëÜ w2 = $1 # w1 - ÁØÔÞàÞÒ, w2 - 60 } $1 == w1 { print ("äÐÜØÛØï: "$1)} # Þ×ÝÐçÕÝÝëÕ ßÕàÕÜÕÝÝëÕ $4 == w2 { print ("ÓÞÔë: " $4)} # ØáßÞÛì×ãîâáï Ò # áÕÛÕÚâÞàÐå ÂÞÓÔÐ ßàØ Òë×ÞÒÕ ÚÞÜÐÝÔë awk -f prim.awk f0 f-awk ÀÕ×ãÛìâÐâ: äÐÜØÛØï: ÁØÔÞàÞÒ ÓÞÔë: 60 ÂÞ Õáâì ÒâÞàÞÕ ßÞÛÕ äÐÙÛÐ "f0" ÔÐÕâ ×ÝÐçÕÝØÕ ßÕàÕÜÕÝÝÞÙ "w1", Ð ßÕàÒÞÕ - "w2". ÍâØ ßÕàÕÜÕÝÝëÕ ØáßÞÛì×ãîâáï Ò áÕÛÕÚâÞàÐå ßàØ ÞÑàÐÑÞâÚÕ äÐÙÛÐ "f-awk". ¸×ÜÕÝØÜ ßàÞÓàÐÜÜã Ò äÐÙÛÕ "f-awk": FILENAME == "f0" { w1 = $2 w2 = $1 next } { print ("äÐÜØÛØï: "$1); next} $4 == w2 { print ("ÓÞÔë: " $4)} ÀÕ×ãÛìâÐâ: äÐÜØÛØï: ¸ÒÐÝÞÒ äÐÜØÛØï: ¿ÕâàÞÒ äÐÜØÛØï: ÁØÔÞàÞÒ äÐÜØÛØï: ÅÒÕÔÞàÞÒ µáÛØ ØáÚÛîçØâì ßÕàÒëÙ ÞßÕàÐâÞà "next", âÞ Ò ÒëåÞÔÝÞÜ äÐÙÛÕ ßÞïÒØâáï ÔÞßÞÛÝØâÕÛìÝÞ ßÕàÒÐï áâàÞÚÐ: äÐÜØÛØï: 60 ßÞáÚÞÛìÚã ÒëÑØàÐÕâáï áÝÞÒÐ ßÕàÒÞÕ ßÞÛÕ Ò ßÕÒÞÜ äÐÙÛÕ ("f0"). µáÛØ ØáÚÛîçØâì Ø ÒâÞàÞÙ "next", âÞ Ò ÒëåÞÔÝÞÜ äÐÙÛÕ ßÞïÒØâáï ÔÞßÞÛÝØâÕÛìÝÞ ßÞáÛÕÔÝïï áâàÞÚÐ: ÓÞÔë: 60 ÚÞâÞàÐï àÐÝÕÕ ÝÕ ÒëÒÞÔØÛÐáì, âÐÚ ÚÐÚ Ò ßàÕÔèÕáâÒãîéØÙ ÞßÕàÐâÞà " { print ("äÐÜØÛØï: "$1)}" ×ÐÚÐÝçØÒÐÛ àÐÑÞâã ÝÐ ¿¾Á»µ´½µ¹ áâàÞÚÕ äÐÙÛÐ "f-awk", ßÞíâÞÜã "next" ßàÞßãáÚÐÛ ßÞáÛÕÔãîéãî ÚÞÜÐÝÔÝãî áâàÞÚã $4 == w2 { print ("ÓÞÔë: " $4)} ¸ ÕéÕ ÞÔÝÐ ÜÞÔØäØÚÐæØï Ò áÒïר á ÒÒÞÔÞÜ ÔÐÝÝëå á âÕàÜØÝÐÛÐ. ²ë×ÞÒ ÚÞÜÐÝÔë ÑãÔÕâ: awk -f prim.awk f0 f-awk ° äÐÙÛ "prim.awk" ßàØÜÕâ ÒØÔ: BEGIN { print ("²ÒÕÔØâÕ ÓÞÔë Ø äÐÜØÛØî: ")} FILENAME == "-" { w1 = $2 w2 = $1 next } $1 == w1 { print ("äÐÜØÛØï: "$1); next} $4 == w2 { print ("ÓÞÔë: " $4)} 9. ²ÁÂÀ¾µ½½Ëµ ÄýºÆ¸¸ ²áâàÞÕÝÝëÕ äãÝ򾯯: sin (expr) áØÝãá expr cos (expr) ÚÞáØÝãá expr exp (expr) ÒÞ×ÒÕÔÕÝØÕ Ò áâÕßÕÝì expr log (expr) ÝÐâãàÐÛìÝëÙ ÛÞÓÞàØäÜ expr sqrt (expr) Ø×ÒÛÕçÕÝØÕ ÚÞàÝï expr int (expr) æÕÛÐï çÐáâì çØáÛÐ length (s) ÔÛØÝÐ áâàÞÚØ s printf (fmt, ...) äÞàÜÐâØàÞÒÐÝØÕ (ÐÝÐÛÞÓØçÝÞ ÁØ) ßÞ áßÕæØäØÚÐæØØ fmt. substr (s, m, n) ßÞÔáâàÞÚÐ Ò n áØÜÒÞÛÞÒ áâàÞÚØ s, ÝÐçØÝÐîéÐïáï á m. getline () çâÕÝØÕ áÛÕÔãîéÕÙ áâàÞÚØ. 0 - ÚÞÝÕæ äÐÙÛÐ, ØÝÐçÕ 1. index (s1, s2) ÝÞÜÕà ßÞ×ØæØØ, á ÚÞâÞàÞÙ s1 áÞÒßÐÔÐÕâ á s2, ØÝÐçÕ 0. split (s, M, c) áâàÞÚÐ s àÐ×ÑØÒÐÕâáï íÛÕÜÕÝâë ÜÐááØÒÐ M ßÞ àÐ×ÔÕÛØâÕÛî c (ßÞ ãÜÞÛçÐÝØî FS=" "); äãÝÚæØï ÒÞ×ÒàÐéÐÕâ çØáÛÞ ßÞÛÕÙ. ¿àØÜÕàë. 1) awk ' BEGIN {FS = "."; a=0} length ($1) > 8 {print (length ($1), $0); a++ } END {print ("½ÐÙÔÕÝÞ áâàÞÚ: " a) }' f-awk ÀÕ×ãÛìâÐâ: 9 ÁØÔÞàÞÒ Á.º. 1979 40 10 ÅÒÕÔÞàÞÒ ¸.Å. 1970 60 ½ÐÙÔÕÝÞ áâàÞÚ: 2 ·ÔÕáâ ßÞÛï àÐ×ÔÕÛïîâáï ßÞ ".", ÒëÑØàÐîâáï áâàÞÚØ ã ÚÞâÞàëå ÔÛØÝÐ ßÕàÒÞÓÞ ßÞÛï ÑÞÛìèÕ 8-ÜØ, Ø Øå ÔÛØÝÐ "length ($1)" ßÕçÐâÐÕâáï ßÕàÕÔ áâàÞÚÞÙ "$0". 2) awk '{i=split($0, Name, "."); for (j=1; j<=i; j++) print ("Name[" j "]=" Name[j]) }' f-awk ÀÕ×ãÛìâÐâ: Name[1]=¸ÒÐÝÞÒ ¸ Name[2]=¸ Name[3]= 1980 50 Name[1]=¿ÕâàÞÒ ° Name[2]=² Name[3]= 1979 40 Name[1]=ÁØÔÞàÞÒ Á Name[2]=º Name[3]= 1979 40 Name[1]=ÅÒÕÔÞàÞÒ ¸ Name[2]=Å Name[3]= 1970 60 3) awk '{print (length)}' f-awk ÀÕ×ãÛìâÐâ: 22 22 22 22 ¿ÞáÚÞÛìÚã ÒáÕ áâàÞÚØ ÑëÛØ ÒëàÞÒÝÕÝë ßàÞÑÕÛÐÜØ, Ð Ò ÔÛØÝÕ áâàÞÚØ ãçØâëÒÐîâáï ÒáÕ áØÜÒÞÛë ÔÞ ÚÞÝæÐ áâàÞÚØ. 4) awk '{printf "%7.2f %s\n", NR, $0}' f-awk echo awk '{printf "\t%s %s \n", NR, $0}' f-awk ÀÕ×ãÛìâÐâ: 1.00 ¸ÒÐÝÞÒ ¸.¸. 1980 50 2.00 ¿ÕâàÞÒ °.². 1979 40 3.00 ÁØÔÞàÞÒ Á.º. 1979 40 4.00 ÅÒÕÔÞàÞÒ ¸.Å. 1970 60 1 ¸ÒÐÝÞÒ ¸.¸. 1980 50 2 ¿ÕâàÞÒ °.². 1979 40 3 ÁØÔÞàÞÒ Á.º. 1979 40 4 ÅÒÕÔÞàÞÒ ¸.Å. 1970 60 |