![]() AWK kalba - subtiliau ir daugiau Kiek anksčiau pristatėme awk kalbą (žr. >>>>> ). Dabar pateiksime naujų aspektų, tačiau prieš tai noriu paminėti pora įdomybių. Dėl visų susitarimų ir detalesnių paaiškinimų žiūrėkite įvadiniame puslapyje... 1. Visada smalsu, kokia yra trumpiausia kažką realaus daranti programa. Pabandykime tokią: O dabar pabandykime ją įvykdyti nurodydami kokį nors failą. Programa nepateikia jokių rezultatų. Ar ji tikrai kažką daro? Visų pirma ji nuskaito visą nurodytą failą eilutė po eilutės. Tačiau kokia iš to nauda? Ogi tas, kad šią programą galima panaudoti patikrinimui, ar failas egzistuoja, o taip pat, jei jis egzistuoja, ar nėra pažeistas. Taigi, ji turi prasmę! 2. Kita įdomus iššūkis parašyti programą, kuri spausdina savo pačios tekstą. awk tai pasiekiama
paprastai programai pateikiamas pačios programos failas, kurio turinį ji atspausdina. Paprasčiausia tokia programa
būtų (pavadinkime ją savipati.awk): Vykdome šią programą nurodydami pačios programos failą ir ji išveda savo pačios tekstą, t.y.
Išraiškos Išraiškas sudaro operatoriais sujungtos konstantos, kintamieji, funkcijos, reguliariuosius išraiškos.
Konstantos yra simbolių eilutės arba skaitinės reikšmės.
Simbolių eilutės yra į kabutes paimtos simbolių sekos, pvz., "Labas, pasauli!". Eilutėse galima panaudoti ir specialias
konstrukcijas (angl. escape sequences), kurių populiaresnės yra: Kintamasis yra vardas, kuriuo žymima nuoroda į reikšmę. Kintamojo atskiro aprašymo nėra, jo sukūrimui pakanka
priskirti reikšmę. Kintamojo varde galima naudoti tik (lotyniškas) raides, skaitmenis ir pabraukimo simbolį ( _ ) ir jis
negali prasidėti skaitmeniu. Beje, awk kalboje didžiosios ir mažosios raidės laikomos skirtingomis, tad
kintamieji alga ir Alga yra skirtingi. Kintamiesiems nenurodomas jų tipas jis atpažįstamas iš konteksto.
Kintamojo (arba simbolių eilutės), kurio reikšmė nėra skaitmenys, skaitinė reikšmė yra 0.
Pvz., išraiška Su objektais (kintamaisiais ir konstantomis) galima atlikti veiksmus. Aritmetiniams veiksmams naudojamo šie operatoriai: Eilučių sujungimo operatorius yra tarpas, pvz., Programa atspausdins Priskyrimo operatoriai Standartinis priskyrimo operatorius yra Įdomu, kad Pailiustruosime tai pavyzdžiu:
Pirmasis print atspausdins Beje, Palyginimo operatoriai: Išvedimas Išvedimas gali būti nukreiptas į failą arba konvejerį, pvz., Pateiksime pavyzdį, išskiriantį visus žodžius tekste ir paskaičiuojantį jų pasikartojimų skaičių:
Šablono paėmimas iš komandos eilutės
Vykdykime programą, nurodydami, kad reikia pateikti tas teksto eilutes, kuriose yra žodis Jonas: Pastaba: Būtina ne tik paimti argumentą (šabloną), bet ir užtikrinti, kad awk nebandytų jo panaudoti kaip failo, kurį reikia skaityti, vardo. Formatuotas išvedimas Kadangi viena pagrindinių awk funkcijų yra pateikti rezultatus (pavadinkime tai ataskaitomis), tai labai
svarbu, kad tai galėtume padaryti priimtinu formatu. Todėl greta Pagrindinis skirtumas tas, kad
Beje, skliaustai nėra būtini, - kaip ir argumentai (kaip jų ir nebuvo ankstesniame pavyzdyje). Formatuojanti išraišką sudaro tekstas, o taip pat formatų specifikatoriai, kurie įvedami procento ženklu (%).
Pateiksime pagrindinių specifikatorių sąrašą: Be to, Bet jei norime pateikiamą tekstą lygiuoti pagal kairę pusę, turime naudoti -, t.y., Išsamesniui pavyzdžiui grįškime prie ankstesniame straipsnelyje pateikto pavyzdžio:
Jame END { } dalį perrašykime taip: Pabandykite abu variantus ir pastebėkite atsakymų pateikimo skirtumus. Realus pavyzdys: Ilgų eilučių laužymas Kartais tekstiniame faile eilutės yra labai ilgos, pvz., visa pastraipa yra išsaugota kaip viena eilutė. Tokį tekstą sunkiau skaityti, tad natūralus noras jo eilutes matyti trumpesnėmis. Nors yra tam skirtų priemonių, tačiau ne visada tinkama programa yra po ranka, o kartais jos yra komercinės ir nepigios, tad paprastam ir greitam sprendimui AWK kalboje buvo sukurta linebreak.awk programa, kuri nuskaito pradinį tekstą ir visas jo eilutes suskaido į trumpesnes pagal nurodytus parametrus. Čia pristatoma supaprastinta tos programos versija (vadinamoji demo). Pilną naujausią (production) versiją galite pasiimti iš Lietuviškos programos VELTUI skilties - paketą lb_awk.zip Ši programa priima failo, kurio eilutes norima suskaidyti, vardą, o taip pat galima nurodyti du (neprivalomus) OS parametrus - minimalų paliekamos eilutės ilgį (MIN) ir maksimalų paliekamos eilutės ilgį (MAX). Jei failas nenurodytas, naudojamas standartinis įvedimo srautas. Programa, pasiekusi minimalų nurodytą ilgį bando rasti esamo žodžio pabaigą ir skelia ties jo pabaiga, jei tik neišeina už maksimalaus eilutės ilgio (šiuo atveju skelia ties ta pozicija). Tad žemiau pateiktą kodą įrašę į linebreak.awk failą, programą galima vykdyti su įvairiais parametais, pvz. # linebreak.awk BEGIN { # priskiriamos nutylimosios reikšmės ir paimami parametrai ORS="\n" ; MINPOS = 70; MAXPOS = 80; if (MIN) { MINPOS = MIN } if (MAX) { MAXPOS = MAX } } { tail = $0; while (length(tail) > MINPOS) { cut_off = substr( tail, 1, MINPOS) slice = substr(tail, MINPOS+1, MAXPOS-MINPOS) # print splited ORS piece bpos = index(slice, " ") if (bpos == 0) { cut_off = cut_off slice; tail = substr(tail, MINPOS + length(slice)+1) } else { cut_off = cut_off substr(slice, 1, bpos) tail = substr (slice, bpos+1) substr(tail, MAXPOS+1) } print cut_off } print tail } Pastaba: Pilnas (ir lankstesnis su daugiau parametrų) šios linebreak.awk variantas (su licencija, aprašais (LT ir EN)
bei pilnu programos kodu) yra Lietuviškos programos VELTUI skiltyje -
kaip lb_awk.zip paketas. Pastaba: Visi pavyzdžiai buvo išbandyti su GAWK ir MAWK realizacijomis Windows (32 bitų) terpei (nuorodos - atsisiuntimui). [ vėliau bus pateikta trečia šios (awk) temos dalis ] Kelios AWK skirtos knygos:
Ankstesnės "Advanced HTML" skyrelio temos: | |