Awk
Az awk egy általános célú programozási nyelv, amelyet szöveges állományok földolgozására terveztek. Elnevezése a megalkotói – Alfred Aho, Peter Weinberger és Brian Kernighan – családnevének kezdőiből született. A UNIX 3 verziójában jelent meg. Ideális szöveges állományok szűrésére, átformálására, kiértékelésére. Ma is minden unix rendszeren van legalább egy awk változat. A Free Software Foundation a gawk nevű változatot gondozza. A linux disztribúciókkal jellemzően a gawk implementációt szállítják. Windows rendszerekhez is letölthető a gawk például a Cygwin részeként.
Az awk kizárólag karaktersorozatokkal, más szóval stringekkel foglalkozik, a számábrázolásra is ezeket használja. Emellett ismeri az asszociatív tömböket is (példa: a["kutya"], a["macska"]), melyeket hash-nak is neveznek. Ezek például szótárszerű alkalmazásoknál nyújtanak kitűnő segítséget. A szabályos kifejezések (idegen szóval regular expressions) szintén a nyelv részei.
Az awk nyelv ereje, rövidsége, de az awk szkriptek határainak felismerése adta Larry Wallnak az ötletet a Perl nyelv kifejlesztésére.
Egy awk program felépítése[szerkesztés]
Egy tipikus awk program a végrehajtása során a bemeneti adatokat egy másféle kimenetté formálja át.
A programok általában mintából és a mintához tartozó parancsokból állnak:
- /1. minta / { parancs(ok) }
- /2. minta / { parancs(ok) }
Az awk soronként olvassa a bemenetet. Minden beolvasott sort összehasonlít a mintákkal, és ha illeszkedést talál, a parancsokat végrehajtja. A mintákat a szabályos kifejezések szabályai szerint értelmezi.
A különleges parancsformák:
- BEGIN { parancs(ok) }
- adatbeolvasás előtt ezeket a parancsokat végrehajtja
- END { parancs(ok) }
- adatbeolvasás és a többi parancs végrehajtása után ezeket a parancsokat végrehajtja
- /minta/
- ha nincs külön parancs megadva, a mintának megfelelő sort kinyomtatja
- { akció }
- ha nincs minta megadva, a parancsokat végrehajtja minden sorra egymás után
Változók[szerkesztés]
Lehetséges a változók használata. A programozó maga is definiálhat változókat, de vannak előre megadott változók, nevezetesen:
- $0
- a feldolgozás alatt álló egész sor
- $1, $2, …$n
- a sor egyes, egymástól szóközzel elválasztott részei.
Ez az automatikus felbontás nagyon egyszerűvé és hatékonnyá teszi az sorok feldolgozását.
Awk parancsok[szerkesztés]
Az awk nyelv szintaxisa hasonlít a C nyelvéhez, ami nem csoda, hiszen az awk nyelv egyik szerzője, Brian W. Kernighan a C nyelv megalkotója. Elemi parancsok a változóknak való értékadás, a változók összehasonlítása, az elágazás (if…else) és a ciklus (for, while). Emellett belső függvényeket, illetve saját implementálású függvényeket is meg lehet hívni. Egy egyszerű függvénydefiníció lehet például a következő:
function add_three (number, temp) { temp = number + 3 return temp }
Egy így definiált függvény az alábbi szintaxissal hívható meg. Ennek a parancsnak a hatására 39 íródik a kimenetre:
print add_three(36)
Az adatokat a "print" paranccsal lehet kinyomtatni, azaz a kimenetre írni. Például egy sor második mezőjét a
print $2
paranccsal nyomtatjuk/írhatjuk ki a szabványos kimenetre.
Példák[szerkesztés]
Helló, világ![szerkesztés]
A „Helló, világ!” program awk-ban a következőképpen implementálható:
BEGIN { print "Helló, világ!" }
Adott karakterszámnál hosszabb sorok kiíratása[szerkesztés]
A következő programmal a 80 karakternél hosszabb sorokat írja ki. Vegyük észre, hogy az alapértelmezett akció a sor kiírása:
length > 80
Minden n. sor kiírása[szerkesztés]
Adatsorok egyenletes ritkítására is felhasználható az awk. Az alábbi programot végrehajtva az awk minden 4. sort ír a kimenetre <ref> Sablon:Cite web </ref>:
awk '{if (count++%4==0) print $0;}' adatsorom.csv
vagy egyszerűbben:
awk '!(count++%4)' adatsorom.csv
Sorok, szavak és karakterek megszámlálása[szerkesztés]
Az alábbi awk program megszámolja majd kiírja a bemeneti fájlban lévő sorok, szavak és karakterek számát úgy, mint a wc nevű program:
{ w += NF c += length + 1 } END { print NR, w, c }
Szavak előfordulási gyakoriságának kiszámítása[szerkesztés]
Szavak gyakoriságáról készít statisztikát asszociatív tömb felhasználásával a következő példa:
BEGIN { RS="[^a-zA-Z]+"}
{ words[tolower($0)]++ }
END { for (i in words)
print i, words[i]
}