• Nem Talált Eredményt

4. Szöveges adatfájlok feldolgozása 53

4.3. Az awk m¶ködése

Az awk az adatfeldolgozás során el®re megadott mintákat keres az adatfájl rekordjaiban (alapesetben soraiban), és azokra a rekordokra (sorokra), amikben egyezést talált a meg-adott mintával, végrehajtja a megmeg-adott utasításokat. Azokra a rekordokra (sorokra), amikben az adott minta nem található meg, nem hajt végre m¶veletet. A feldolgo-zás során végighalad az adatfájl minden rekordján (során), majd befejezi a m¶ködését.

A feldolgozás során számokkal, karakterekkel, szövegrészekkel végezhetünk m¶veleteket, beleértve matematikai és logikai kifejezések használatát is.

Az awk program alapvet®en mintatevékenység utasítások sorozatából áll:

Minta { tevékenység utasítások }

Az awk sor orientált nyelv. El®bb jön a minta, majd a tevékenység. A Minta egy jelso-rozat, ami meghatározza, hogy mely rekordokra legyenek végrehajtva az tevékenység utasítások részben megadott parancsok. A tevékenység-utasítások { és } közé vannak zárva. Vagy a minta, vagy a tevékenység elmaradhat, de természetesen mindkett® nem.

Ha a minta hiányzik, a tevékenység minden egyes bemen® rekordon végrehajtódik. A hiányzó tevékenység ugyanaz, mint a

{ print }

utasítás, amely kiírja az egész rekordot.

4.3.1. Minták

Az awk minták a 4.1. táblázatban felsoroltak lehetnek. A BEGIN és az END két spe-ciális minta, amely nem inputfügg®. A BEGIN blokkok azel®tt kerülnek végrehajtásra, miel®tt bármilyen bemenet beolvasása megtörténne. Ehhez hasonlóan az END blokkok akkor hajtódnak végre, amikor minden bemenet beolvasása véget ért (vagy amikor exit utasítás hajtódik végre). A BEGIN és az END blokkok nem kombinálhatók más mintákkal a mintakifejezésekben. A BEGIN és az END minták után nem hiányozhat a tevékenység rész.

A /reguláris kifejezés/ mintákhoz rendelt utasítás minden olyan rekordra végrehajtó-dik, amely illeszkedik a reguláris kifejezésre. A reguláris kifejezések összefoglalását lásd

4.1. táblázat. A gawk minták BEGIN

END/reguláris kifejezés/

relációs kifejezés minta1 && minta2

minta1 || minta2

minta1 ? minta2 : minta3

(minta)

! minta

minta1, minta2

A relációs kifejezésekben szerepelhet az alábbi, tevékenységekr®l szóló részben de-niált operátorok közül bármelyi. Ezek rendszerint azt ellen®rzik, hogy bizonyos mez®k illeszkednek-e bizonyos reguláris kifejezésekre.

Az &&, ||, és ! operátorok rendre a logikai ÉS, logikai VAGY és logikai NEM (mint a C programnyelvben) jelölésére szolgálnak. Csak addig értékel®dnek ki, ameddig egy-értelm¶en eld®l, hogy logikai igaz vagy hamis az értékük. Egyszer¶bb mintakifejezések összekapcsolására szolgálnak. Mint a legtöbb nyelvben, zárójelek használhatók a kiérté-kelés sorrendjének megváltoztatására.

A ?: operátor hasonlít a C ugyanezen operátorához. Ha a minta1 igaz, akkor minta2

kerül felhasználásra az ellen®rzéshez, egyébként a minta3. A minta2és minta3közül csak az egyik értékel®dik ki.

A minta1, minta2 kifejezésforma neve tartományminta. Ez illeszkedik a minta1-re illeszked® rekorddal kezdve folytatólagosan minden bemen® rekordra, egy, a minta2-re illeszked® rekordig beleértve a két határmintára illeszked® rekordokat is. Nem m¶ködik együtt másfajta mintakifejezésekkel.

4.3.2. Változók, rekordok és mez®k

Az gawk változók dinamikusan, els® használatukkor jönnek létre. Értékük lehet lebeg®-pontos szám, karakterlánc, vagy mindkett®, a használatuk módjától függ®en. Az awk-ban egydimenziós tömböket is létre lehet hozni. A tömbök asszociativak, azaz kulcs érték párokból állnak, ahol a kulcsok egyediek. A kulcsok tetsz®legesek lehetnek, ezért a többdimenziós tömbök könnyen szimulálhatók.

Rekordok

Az gawk az adatfájlt rekordonként olvassa be, ahol a rekordokat az úgynevezett rekord-elválasztó választja el egymástól. Ez alapesetben az newline karakter, de a rekordelvá-lasztás módja az RS nev¶ beépített változó értékének megváltoztatásával módosítható.

Ha az RS változó értéke egyetlen karakter, akkor ez a karakter lesz a rekordelválasztó, egyébként RS reguláris kifejezésként értelmezi a program. Ebben az esetben minden, erre a reguláris kifejezésre illeszked® szöveg rekordelválasztó lesz. Ha RS üres karakter-láncra van beállítva, akkor a rekordokat üres sorok választják el. Ilyenkor az newline karakter mez®elválasztóként viselkedik, bármilyen érték¶ is FS.

Mez®k

A gawk a beolvasott rekordokat úgynevezett mez®kre bontja a mez®elválasztók mentén, melyet a FS változó értékeként lehet megadni. Ha FS egyetlen karakter, akkor ez a karakter választja el a mez®ket. Ha FS üres karakterlánc (FS=""), akkor minden egyes karakter külön mez® lesz. Egyébként a program FS-t, mint reguláris kifejezést kezeli.

Abban a speciális esetben, ha FS egyetlen space, akkor a mez®ket nemcsak a space, hanem a tab és/vagy az newline karakterek is elválasztják.

A mez®k értékeire a $1, $2, stb. kifejezésekkel lehet hivatkozni. Ezek szintén változók, melyeknek akár új értéket is adhatunk. A $0 mez® az egész rekordot (sort) jelenti.

A mez®hivatkozásnak nem szükséges konstansnak lennie:

n = 5 print $n

kiírja a bemeneti rekord ötödik mez®jét. Az NF változó a bemeneti rekord mez®inek számát tartalmazza, tehát tetsz®leges rekord utolsó mez®jére a $NF kifejezéssel hivatkoz-hatunk.

Beépített változók

A gawk legfontosabb beépített változói:

RS A bemeneti rekordelválasztó (Record Separator). Ez a változó írja el® az awk prog-ramnak, hogy a bemenetként feldolgozandó állományban milyen karakterelemek válasszák el a rekordokat. A feldolgozás közben átállítható, a változást a gawk gyelembe veszi. RS alapértelmezésben az newline karakter.

FS Feladata hasonló, mint a rekordelválasztó változónak. Az aktuálisan beolvasott re-kord mez®elválasztó (Field Separator) elemét jelöli ki. Az alapértelmezett értéke a space.

NR Ez a változó a rekord beolvasása után frissül, és a már beolvasott rekordok számát (Number of Records) mutatja.

NF Dinamikusan frissül® változó, mely a a mez®k számát (Number of Fields) mutatja az adott rekordban. Értékét minden rekord beolvasása után automatikusan kapja.

IGNORECASE A bemenet feldolgozásához használt kapcsoló, ha az értéke nem nulla, akkor a kis és nagybet¶ket a gawk nem különbözteti meg.