lo dvoetochij = 5 CHislo tochek s zapyatoj = 6 CHislo slov = 50 CHislo simvolov v slovah = 150 CHislo predlozhenij = 10 Srednyaya dlina predl. = 5 (slov) Srednyaya dlina slova = 3 6. Vvod i vyvod dannyh v AWK-programmah Vvod dannyh v AWK-programmu opredelyaetsya imenem vhod- nogo fajla v komandnoj stroke. Takih fajlov mozhet byt' nes- kol'ko, i obrabatyvat'sya AWK-programmoj oni budut posledova- tel'no v tom poryadke, v kotorom ukazany v komandnoj stroke, naprimer: awk -f prog f1 f2 f3 f4 AWK-programma iz fajla prog budet vypolnyat'sya nad vhodnym potokom zapisej iz fajlov f1, f2, f3 i f4. Zdes' neobhodimo otmetit', chto predopredelennaya peremennaya NR budet imet' znachenie, ravnoe poryadkovomu nomeru zapisi ( NR ne obnulya- etsya pri perehode k chteniyu ocherednogo fajla). Pust' imeyutsya chetyre fajla. Fajl f1: a[1][1] a[1][2] a[1][3] a[1][4] a[2][1] a[2][2] a[2][3] a[2][4] a[3][1] a[3][2] a[3][3] a[3][4] a[4][1] a[4][2] a[4][3] a[4][4] Fajl f2: b[1][1] b[1][2] b[1][3] b[1][4] b[2][1] b[2][2] b[2][3] b[2][4] b[3][1] b[3][2] b[3][3] b[3][4] b[4][1] b[4][2] b[4][3] b[4][4] Fajl f3: c[1][1] c[1][2] c[1][3] c[1][4] c[2][1] c[2][2] c[2][3] c[2][4] c[3][1] c[3][2] c[3][3] c[3][4] c[4][1] c[4][2] c[4][3] c[4][4] Fajl f4: - 26 - d[1][1] d[1][2] d[1][3] d[1][4] d[2][1] d[2][2] d[2][3] d[2][4] d[3][1] d[3][2] d[3][3] d[3][4] d[4][1] d[4][2] d[4][3] d[4][4] Kazhdyj iz etih fajlov vklyuchaet po chetyre zapisi (po chetyre polya v kazhdoj). Drugimi slovami, kazhdyj fajl - matrica (4*4). Dopustim, neobhodimo poluchit' novuyu matricu s raz- mernost'yu (4*4), stolbcy kotoroj sostavleny iz elementov diagonalej ishodnyh matric. Nizhe priveden tekst programmy, v kotoroj reshaetsya eta zadacha: { if( FILENAME != Name ) { i = 0; Name = FILENAME; } i++; if( i == 1 ) { Dig1 = Dig1 " " $1; next; } if( i == 2 ) { Dig2 = Dig2 " " $2; next; } if( i == 3 ) { Dig3 = Dig3 " " $3; next; } if( i == 4 ) Dig4 = Dig4 " " $4; } END { print( Dig1 ); print( Dig2 ); print( Dig3 ); print( Dig4 ); } V programme dva pravila. Pervoe pravilo ne soderzhit selektora, sledovatel'no, vypolnyaetsya dlya vseh vhodnyh zapi- sej. Vtoroe pravilo vypolnyaetsya po zaversheniyu vhodnogo potoka. Programma rabotaet sleduyushchim obrazom: pervonachal'no proveryaetsya, izmenilos' li imya vhodnogo fajla (predoprede- lennaya peremennaya FILENAME), zatem, esli ne izmenilos', prisvaivaetsya znachenie sootvetstvuyushchego polya zapisi k pere- mennoj Dig (ispol'zuetsya operaciya konkatenacii starogo zna- cheniya Dig so znacheniem polya i prisvaivaniya Dig novogo znache- niya). Peremennaya Name prednaznachena dlya sohraneniya imeni vhodnogo fajla. Pervonachal'no znacheniya peremennyh Name i Dig - 27 - ravny pustym strokam. Vazhno, chto my znaem tochno chislo zapi- sej, eto pozvolyaet vydelyat' nuzhnye polya v zapisyah. Dopus- tim, vypolnyaetsya sleduyushchaya komandnaya stroka: awk -f prog f1 f2 f3 f4 >&gt; Result v fajle Result budem imet': a[1][1] b[1][1] c[1][1] d[1][1] a[2][2] b[2][2] c[2][2] d[2][2] a[3][3] b[3][3] c[3][3] d[3][3] a[4][4] b[4][4] c[4][4] d[4][4] Rezul'tat raboty programmy sushchestvenno svyazan s poryadkom chteniya vhodnyh fajlov. Esli vypolnit' komandnuyu stroku awk -f prog f4 f3 f2 f1 >&gt; Result poluchim: d[1][1] c[1][1] b[1][1] a[1][1] d[2][2] c[2][2] b[2][2] a[2][2] d[3][3] c[3][3] b[3][3] a[3][3] d[4][4] c[4][4] b[4][4] a[4][4] Kogda voznikaet neobhodimost' peredat' v AWK-programmu znacheniya nekotoryh peremennyh, mozhno vospol'zovat'sya vozmozh- nost'yu ukazat' ih v fajle. Dopustim, zaranee ne izvestny obrazcy dlya vydeleniya zapisej fajla f1. V etom sluchae mozhno sozdat' fajl f0 s opisaniyami obrazcov i, vospol'zovavshis' znacheniem peremennoj FILENAME, prisvoit' etim peremennym nuzhnye znacheniya. Pust' fajl f0 imeet vid: aaa bbb ccc Pust' fajl f1 imeet vid: aaa bbb ccc ddd eee eee bbb ccc ddd aaa aaa fff ccc ddd eee aaa bbb ggg ttt eee Programma na AWK: - 28 - FILENAME == "f0" { pat1 = $1; pat2 = $2; pat3 = $3; next; } $1 == pat1 { print; next } $2 == pat2 { print; next } $3 == pat3 { print } Posle vypolneniya komandnoj stroki awk -f prog f0 f1 poluchim v fajle Result: aaa bbb ccc ddd eee aaa fff ccc ddd eee aaa bbb ggg ttt eee Mozhno predusmotret' vvod peremennyh so standartnogo vvoda; vospol'zuemsya tem, chto peremennaya FILENAME dlya stan- dartnogo vvoda opredelena kak "-". Pust' fajl f1 imeet vid: aaa bbb ccc ddd eee eee bbb ooo ddd aaa aaa fff ccc ddd eee qqq bbb ggg ttt eee ooo fff ggg ttt eee ccc bbb ggg ttt eee Privedennaya nizhe programma pozvolyaet poluchit' znacheniya pere- mennyh s klaviatury displeya: BEGIN { print("Vvodite znacheniya polej:"); } FILENAME == "-" { pat1 = $1; pat2 = $2; pat3 = $3; } FILENAME == "f1" { if($1 == pat1) { print($0); next } if($2 == pat2) { print($0); next } if($3 == pat3) { print($0);} } Posle zapuska na vypolnenie sleduyushchej komandnoj stroki awk -f prog - f1 - 29 - programma budet zhdat' vvoda s klaviatury displeya (zavershit' vvod neobhodimo simvolom konec fajla - CTRL/D). Naprimer: Vvodite znacheniya polej: qqq fff ooo CTRL/D eee bbb ooo ddd aaa aaa fff ccc ddd eee qqq bbb ggg ttt eee ooo fff ggg ttt eee Kak uzhe govorilos' ran'she, vyvod AWK-programmy naprav- lyaetsya na ekran displeya, esli ne bylo ukazano drugoe. Sushchestvuet vozmozhnost' napravit' vyvod po neskol'kim kanalam neposredstvenno iz AWK-programmy, dlya etogo mozhno vospol'zo- vat'sya standartnymi sredstvami sistemy DEMOS. Naprimer: print( $0 ) >&gt; "file"; zapis' budet napravlena v fajl s imenem ./file; print( $0 ) >&gt;>&gt; "file"; zapis' budet dopisana v ./file; print( $0 ) >&gt; $2; zapis' budet napravlena v fajl s imenem, ravnym soderzhimomu ee vtorogo polya. Sushchestvuet vozmozhnost' iz AWK-programmy napravit' vyvod v konvejer, naprimer: { print($0) | "tr ' ' '\n' | sort "; } Zdes' zapis' budet napravlena komande tr, kotoraya zamenit probel simvolom '\n', zatem otsortirovana komandoj sort. Pust' vypolnena sleduyushchaya komandnaya stroka: awk -f prog - posle vvoda s klaviatury neskol'kih zapisej dfa nrk klm njf rty xvz saa ass dcf vfr klm ttr CTRL/D poluchim: - 30 - ass dcf dfa klm klm njf nrk rty saa ttr vfr xvz Vyvod rezul'tata raboty konvejera osushchestvlyaetsya po zavershe- niyu chteniya poslednej vhodnoj zapisi. Kanal vyvoda v primere sovpadaet s kanalom standartnogo vyvoda, no ego mozhno pere- opredelit' na lyuboj fajl. V odnoj AWK-programme mozhno odnovremenno opredelit' neskol'ko kanalov vyvoda, chislo kotoryh zavisit ot chisla fajlov, razreshennyh dlya odnovremennogo ispol'zovaniya. |to chislo ustanavlivaetsya pri generacii operacionnoj sistemy DEMOS. Dlya vyvoda dannyh v AWK-programme prednaznachen operator print. Do nastoyashchego momenta my primenyali lish' odnu formu ispol'zovaniya etogo operatora: print(spisok_fakticheskih_parametrov); Kruglye skobki ispol'zovalis' ran'she dlya togo, chtoby ne otv- lekat' chitatelya, znakomogo s yazykom programmirovaniya Si, - ih mozhno ne ukazyvat'. Sushchestvuyut i drugie formy ispol'zova- niya etogo operatora: print; vyvoditsya vsya zapis'; print $1, $2; znacheniya polej vyvodyatsya cherez probel; print $1 $2; vyvoditsya konkatenaciya znachenij polej. Pri neobhodimosti upravleniya formatom vyvoda mozhno ispol'zovat' bibliotechnuyu funkciyu printf, sintaksis i rezul'tat raboty kotoroj takie zhe, kak i v yazyke Si. 7. Ispol'zovanie vstroennyh funkcij - 31 - Interpretator awk vklyuchaet nabor vstroennyh funkcij, kotorye mozhno ispol'zovat' v dejstviyah pravil. Sushchestvuyut dva sposoba vyzova vstroennyh funkcij: imya_funkcii(spisok_fakticheskih_parametrov) imya_funkcii Vo vtorom sluchae v kachestve fakticheskogo parametra primenya- etsya vsya tekushchaya zapis'. Kak obychno, znachenie funkcii pods- tavlyaetsya v vyrazhenie v tom meste, gde opredelen vyzov. Imeyutsya sleduyushchie vstroennye funkcii: length(vyrazhenie) znacheniem vyrazheniya yavlyaetsya stroka. Funkciya length vozvrashchaet dlinu stroki, naprimer: print( length($1 " " $2)); budet napechatana dlina stroki, poluchennoj konkatenaciej polya $1, probela i polya $2. Forma bez argumenta vozv- rashchaet dlinu zapisi. exp(vyrazhenie) vozvrashchaet eksponentu ot vyrazheniya. log(vyrazhenie) vozvrashchaet natural'nyj logarifm vyrazheniya. sqrt(vyrazhenie) vozvrashchaet znachenie kvadratnogo kornya ot vyrazheniya. int(vyrazhenie) vozvrashchaet celuyu chast' chisla, ravnogo znacheniyu vyrazhe- niya. substr(S, M, N) vozvrashchaet chast' stroki S, nachinayushchuyusya ot pozicii M i imeyushchuyu dlinu ne bolee N simvolov. Simvoly v stroke S numeruyutsya s 1. Esli argument N ne ukazan, vozvrashcha- yutsya vse simvoly ot M do konca stroki. string = substr( $0, 12, 20); String budet vklyuchat' 9 simvolov (s 12 po 20) tekushchej zapisi. index(As, Ps) vozvrashchaet nomer pozicii, s kotoroj stroka Ps sovpadaet so strokoj As. Esli sovpadeniya net, vozvrashchaetsya 0. - 32 - sprintf(format, vyrazhenie, ...) vozvrashchaet stroku, vyvedennuyu po formatu. Sintaksis funkcii i rezul'tat raboty analogichny funkcii sprintf v biblioteke yazyka programmirovaniya Si. split( S, Name, razdelitel' ) stroka S razbivaetsya na polya, znacheniya kotoryh prisvai- vayutsya elementam massiva Name. Znacheniem pervogo ele- menta Name[1] budet soderzhimoe pervogo vydelennogo polya, znacheniem vtorogo elementa Name[2] - vtorogo vydelennogo polya i tak dalee. Esli ne ukazan razdeli- tel' polej, ispol'zuetsya znachenie predopredelennoj peremennoj FS. Funkciya split vozvrashchaet chislo vydelen- nyh polej. Rassmotrim primer. Pust' imeetsya fajl f1 aaa bbb ccc# ddd# eee fff# ggg ttt# ggg eee# ccc ddd sss# yyy i AWK-programma { i = split( $0, Name, "#"); for(j = 1; j <&lt;= i; j++) print( "Name["j"] =", Name[j]); } posle vypolneniya komandnoj stroki awk -f prog f1 poluchim: Name[1] = aaa bbb ccc Name[2] = ddd Name[3] = eee fff Name[4] = ggg Name[1] = ttt Name[2] = ggg eee Name[3] = ccc ddd sss Name[4] = yyy - 33 - SODERZHANIE Annotaciya ......................................... 2 1. Principy raboty interpretatora awk ................ 3 2. Peremennye, vyrazheniya i prisvaivaniya v AWK- programmah ........................................ 7 3. Struktura AWK-programmy ........................... 13 4. Selektory ......................................... 16 5. Dejstviya .......................................... 22 6. Vvod i vyvod dannyh v AWK-programmah .............. 26 7. Ispol'zovanie vstroennyh funkcij .................. 31 - 34 -