Professional Documents
Culture Documents
Az awk
1. Bevezet...........................................................................................................................................1 2. Rekordok s mezk .........................................................................................................................2 3. Az awk programozsi nyelv ............................................................................................................3 Az awk minta ..................................................................................................................................3 Az utastsok .......................................................................................................................................4 A vltozk............................................................................................................................................5 Bels vltozk .....................................................................................................................................5 Konstansok...........................................................................................................................................6 Opertorok............................................................................................................................................7 Programszervez utastsok ................................................................................................................8 Fggvnyek..........................................................................................................................................9 A fontosabb numerikus fggvnyek................................................................................................9 Fontosabb sztring fggvnyek.........................................................................................................9 Fontosabb ki s bemeneti fggvnyek ..........................................................................................10 Egysoros pldaprogramok..................................................................................................................10 Tbb llomny egyidej feldolgozsa s a getline fggvny .......................................................11 Kls parancsok futtatsa...................................................................................................................12 Sajt fggvnyek ...............................................................................................................................12 Tmbk az awk-ban...........................................................................................................................13 Tmbk ltrehozsa a split fggvnnyel.......................................................................................16 Tbbdimenzis tmbk.................................................................................................................16 Bibliogrfia.........................................................................................................................................17
1. Bevezet
Az awk egy programozsi nyelv, szerzi "awk, a pattern scanning and processing language": minta elemz s feldolgoz nyelv nevet adtk neki. A nyelv tulajdonkppen brmilyen felpts szvegbl mintk alapjn sorokat vagy mezket tud kiemelni, s azokkal mveleteket tud vgezni. gy akr a UNIX programok kimenett (pl. az ls -l parancs kimenett) akr adatokat tartalmaz mezkre bonthat llomnyok (pl. a .csv tpus llomnyok) soraibl ki lehet vele hmozni a re bzott feladat megoldshoz szksges mezket. Ezekkel klnbz matematikai illetve szveges mveleteket tud vgezni. A nyelv programozsi szerkezetei a C nyelv utastsaira plnek. Nevt a szerzk nevnek kezdbetibl lltottk ssze: Aho Weinberger Kernighan. Az awk rendkvli mdon megknnyti a szveges llomnyok feldolgozst. A mrnki munkban nyers adatok el feldolgozst vgezhetjk vele knnyen. A UNIX/Linux alatti rendszerprogramozsban a parancsok kimenett (pl. az ls -l parancs szveges kimenett) dolgozhatjuk fel knnyen. Mivel szkript nyelv s igen tmr, kis mindennapi feladatok megoldst vgezhetjk el vele gyorsan. A nyelv szerzi nem ajnljk a nyelvet nagy s bonyolult feladatok megoldshoz: ennek ellenre, elg sok tpus feladatot lehet vele megoldani, klnsen azokat, amelyek rendszerprogramozshoz kzeliek, s pl. vals szmokkal is kell szmolni. A segdlet az awk fontosabb elemeit mutatja be. Kimert tanulmnyozshoz a felhasznli kziknyv vagy egyb dokumentcik tanulmnyozsa szksges (bibliogrfia a dokumentum vgn. A felhasznli kziknyvnek van magyar fordtsa). Ebben a rvid bemutatban a hangsly a feldolgozprogram elvnek megrtsn van. Az awk-nak tbb vltozata van, az albbiak a GNU 1
awk-ra rvnyesek Linux alatt. A program indtsa hasonl a sed -hez, a program vgigolvassa a bemenett (a standard input jelenti az implicit bemenetet), feldolgozza azt s a kimenetre r. A -f kapcsol ugyangy a szkript llomnyra hivatkozik, de a szkript megjelenhet az els paramterben is idzjelek kztt. Az ltalunk hasznlt kapcsolk: Field separator: megllaptja a mezelvlaszt karaktert. Ha nem adjuk meg, akkor az implicit elvlaszt a szkz s a TAB, illetve ezek ismtldse (tulajdonkppen egy regulris kifejezs minta: [ \t]+ .
-F c -f file a szkript llomny megadsa -v var=val a var vltoznak val rtket ad induls eltt
sorral kezdden kln llomnyba, melynek j ha a .awk kiterjesztst adjuk megklnbztets vgett.
2. Rekordok s mezk
Mkdsi elv Az awk a kvetkez feldolgozst alkalmazza a bemeneti sorokra: gy tekinti a sorokat, mint egy elvlaszt karakterrel (vagy karakter szekvencival) hatrolt, mezkbl ll sor. Egy sornak a neve rekord (ez a feldolgozsi egysg). Pl. az albbi sor (vagy rekord) esetn:
112 LinkinPark Numb numb.txt 35
a sornak 5 mezje van, az elvlaszt egy szkz. A sor feldolgozsa kzben a nyelv a mezkre a $1, $2, ... vltozkkal hivatkozik. Pl. a $3 rtke Numb . A teljes sorra a $0 vltozval lehet hivatkozni. Ugyanakkor a mezkre az albbi szerkezet vltozkon keresztl is lehet hivatkozni, a:
k=3 print $k
a harmadik mez rtkt fogja kinyomtatni (lsd albb hogyan definiljuk a vltozkat). A sorok szmt az awk az NR (Number of Rows - az sszes eddig beolvasott sor) s FNR (az aktulis bemeneti llomny, ha tbb van) vltozkban kveti. A mezk szma az FN vltozban van, amely az utols mez cmzsre is hasznlhat: $FN. Az albbi plda:
print $FN
az utols mezt nyomtatja, fggetlenl attl, hogy hny van. A mezk cmzsre kifejezsek is hasznlhatak:
print $(2+2)
a negyedik mezt fogja nyomtatni. Hasznlat kzben az awk ltal ellltott mezknek meg lehet vltoztatni az rtkt:
echo 'a b' | awk '{$1="b"; print $0}'
A {} blokkban utastsok kvetik egymst. Az awk fggvnyei kzl a legegyszerbb a print : kinyomtatja a $0 vltoz tartalmt egy sort.
{print}
Akr a sed, normlis menetben az awk egy-egy sort olvas a $0 vltozba, feldolgozza azt: azaz alkalmazza re szablyait ha a szablyhoz rendelt cm kivlassza a sort. Ezt a mveletet ismtli amg a bemenetrl elfogynak a sorok. Az awk minti bvtett regulris kifejezseket hasznlnak, pl. a:
/^a/
azokat a sorokat fogja kivlasztani amelyek 'a' -val kezddnek. Az awk szablyban a mintnak vagy tevkenysgnek meg kell jelennie. Ha a minta elmarad, a tevkenysget minden bemeneti sorra alkalmazza az awk, ha a tevkenysg marad el, akkor az implicit tevkenysg a print $0 , azaz a bemeneti sor nyomtatsa. gy:
$ echo alma | awk '/^a/{print $0}' alma
is kinyomtatja a bemeneti sort, mert nincs minta, teht minden sorra illeszkedik.
Az awk minta
A minta felptse bonyolultabb mint a sed ltal hasznlt. Az albbi tblzat tartalmazza lehetsges felptst: Mintk
BEGIN END
Feldolgozs A BEGIN s END specilisak: az utnuk kvetkez utastsokat a sorok feldolgozsa eltt (BEGIN) illetve minden sor feldolgozsa utn (END) hajtja vgre az awk, egyetlen egyszer. Ezek a program elkszt utastsai (pl. vltozk kezdeti rtknek megadsa) illetve befejez utastsai (pl. vgs eredmny nyomtatsa). 3
Mintk
Feldolgozs A program futtathat bemenet nlkl is, ha csak a BEGIN mintt hasznljuk. Ilyenkor vgrehajtja utastsait s utna kilp.
/regex/
Regulris kifejezs: a awk bvtett (extended) kifejezseket hasznl, ugyanazokat mint az egrep. Nincs teht szksg kln kapcsolra, hogy ezt bejelljk. 2 minta s, vagy illetve nem logikai relcijbl kpzett felttel. Az && esetben pl. mindkt mintnak illeszkednie kell a feldolgozand sorra, az || esetben csak az egyiknek. A ! -al jellt mintk esetben a blokk csak akkor hajtdik vgre, ha a minta nem vlassza ki a sort. tartomny cmzse kt mintval A C-hez hasonl feltteles teszt. Ha a minta tall, akkor a minta1 teszt lesz dnt, ha nem akkor a minta2. Az awk vltozira alkalmazott C-szer relcis kifejezs,pl:
$1 > 2
minta && minta minta || minta ! minta minta1, minta2 minta ? minta1 : minta2 relcis kifejezs
teht ha az els mez numerikusan, szmm alaktva nagyobb mint 2, akkor arra a sorra vgrehajtdik az utastssorozat. A kifejezsben a C nyelv relcis kifejezseit lehet hasznlni (>, <, <=, >=, ==, != ). A C nyelvhez kpest van kt opertor ami klnbzik azoktl: a ~ s a ~! (match s no match). Hasznlatuk gy trtnik:
$1 ~ /^a/
jelentse: ha az els mez kis a betvel kezddik, azaz illeszkedik a megadott regulris kifejezsre. A kifejezs akkor vlasztja ki a tevkenysget, ha az rtke 0-tl klnbzik amennyiben vals szmra lehet konvertlni, vagy nem az res sztring amennyiben sztringre. Teht a kifejezseket sztringekre is lehet alkalmazni: ilyenkor az awk karakterenknt hasonltja ssze a sztringeket. ha kt sztring megegyez karakterei ugyanazok, akkor a hosszabbik tekintend nagyobbnak. Pl. "10" kisebb mint "9" , mert els karaktereik sszehasonltsakor a 1 < 9. De 10 nagyobb mint 9: az awk az adattpustl fggen vgzi el az sszehasonltst.
Az utastsok
Az awk nyelv elemei { } zrjelek kz kerlnek s szablyokat hatroznak meg. A C nyelvhez hasonlan, vltoz rtkadst, programszervez utastsokat, kifejezseket tartalmaznak. Az opertorok, utastsok a C-hez hasonlak (a C nyelvet vettk mintnak a tervezsknl). Pl.
{a=2; print a}
Az utastsok kzt az elvlaszt az jsor karakter lehet, amennyiben egy sorba tbb kerl akkor a ; . Az awk program 3 rszt tartalmazhat, egy bevezet (BEGIN), egy szvegsoronknt vgrehajthat s egy zr (END) programrszt, teht ltalnosan gy nz ki:
BEGIN {bevezet utastsok} minta { a kivlasztott sorra vgrehajtott utastsok} END {zr utastsok }
A minta {utastasok} szerkezet egyms utn tbbszr is elfordulhat, s ez a rsz ismtldik minden egyes feldolgozott sorra. pl.:
$ echo '1 2'| awk 'BEGIN{a=1} {a=a+$1+$2} END{print a}' 4
A vltozk
Az awk vltozneveket ugyangy jelljk mint a C nyelv vltozit. A deklarci pillanatban jnnek ltre s tpusukat nem kell explicit deklarlni (teht nem szksges ket mg csak a BEGIN rszben sem deklarlni), s a krnyezettl fggen lesznek valsak vagy karakterlncok. A szkript nyelvekre jellemzen ezek dinamikus vltozk. A nyelv kt tpussal rendelkezik: vals illetve sztring. Pl.
s="alma" egy sztringet hoz ltre, x=2.2 pedig egy vals vltozt. y=$10 Az y a $10 meztl fggen lesz vals vagy karakterlnc.
Bels vltozk
A program tartalmaz bels vltozkat, ezek mindig ltrejnnek, nem kell ket deklarlni. Kzlk az albbi fontosabbakat fogjuk hasznlni: Vltoz ARGC FILENAME FS Angol neve Mit tartalmaz Implicit rtk
Command line Hny argumentum van az awk parancssorn nincs argument count Filename Input Field Separator A bemeneti llomny neve A bementi mezelvlaszt karakter vagy szkz s karakterek. Az FS regulris kifejezs is tabultor, azaz: lehet, tulajdonkppen az implicit rtk is az, [\t ]+ pontosan: [\t ]+ , teht szkz vagy TAB legalbb egyszer. Ha az FS rtke az res sztring (FS="") akkor a bemenet minden egyes karaktere 5
Vltoz RS
Mit tartalmaz kln meznek szmt. Ez a rekord (azaz bemeneti sor) elvlaszt. Ez is regulris kifejezs, megvltoztathat. Ha nem zr, akkor a regulris kifejezseknl kis nagybet nem szmt. Hny mez van a bemeneti rekordban
Implicit rtk
\n egy jsor
karakter 0 nincs
NR
Number of Hnyadik sornl tart a feldolgozs records seen so far The output format for numbers Hogyan formatlja a vals szmokat ha a kimenetre rjuk azokat. Lthat az implicit rtkbl, hogy a formtumokat a C nyelv printf fggvnynek formatl sztringjeivel lltja el. A kimenti mezelvlaszt karakter. A kimenti rekord (azaz sor) elvlaszt karakter. Implicit jsor, akr ms is lehet, amennyiben pedig az res sztring, akkor a kimeneten nem lesznek sztvlasztva a sorok.
nincs
OFMT
"%.6g"
OFS ORS
szkz jsor
Az ARGV illetve ENVIRON vltozk a parancssor argumentumait illetve a krnyezeti vltozkat tartalmazzk s ezek awk tmbk (lsd albb).
Konstansok
Sztring konstansok A sztring konstansok ketts idzjellel krlvett sztringek. A sztringeken bell hasznlhatak a C nyelv escape szekvencival megadott specilis karakterei, a:
\\ backslash \b backspace \f form-feed \n newline - jsor \r carriage return kocsi vissza \t horizontal tab - tabultor \v vertical tab fggleges tabultor \xhex szmjegyek, pl: \xod \c literlisan a c karaktert jelenti, pl.
\? a ? -t
Opercis rendszerek I. - UNIX felhasznli ismeretek s hjprogramozs abc def itt ujsor jon
A tzes szmrendszerben, nyolcasban s tizenhatosban megadott konstansokat ugyangy kezeli mint a C nyelv. Pl:
echo '' | awk '{print 10.2,011,0x22}' 10.2 9 34
Opertorok
Az awk a C nyelv opertorait hasznlja, ezek vltozira s konstansaira alkalmazhatk. Az opertorok:
( ) $ ++ -^ + - ! * / % + < > <= >= != == ~ !~ zrjel, csoportost mez referencia, pl.: $1 prefix s postfix inkrementls, pl.: hatvny (** is hasznlhat) + - egyo perandussal, s tagads szorzs, oszts, modul sszeads, kivons relcisak Regulris kifejezs tesztelse (illeszts, match) annak tagadsa. Ha a regulris kifejezs konstans, azt a mvelet jobb oldaln kell hasznlni. pl.: $1 ~ /abc/ logikai S logikai VAGY feltteles teszt hozzrendels s mvelet
i++
&& || ?: = += -= *= /= %= ^=
Az opertorok precedencija s asszociativitsa ugyanaz mint a C-nl. Klnbsgek a C nyelvhez kpest: -a sztringek sszefzsnek opertora a szkz karakter, teht:
{print "a" "b"} ab -t fog kirni
-a nyelv nem rendelkezik a vessz opertorral, teht nem hasznlhatunk ilyen szerkezeteket mint:
a=2, b=5
Pl:
#inkrementls $ echo '' | awk '{i=0; i++; print i}' 1
#regulris kifejezs illeszts $ echo '112' | awk '\ {if ($1 ~ /[0-9]+/)\ {print "az elso mezo szamokbol all"}}' az elso mezo szamokbol all $ echo 'abc' | awk '{if ($1 !~ /[0-9]+/)\ {print "az elso mezo nem all szamokbol"}}' az elso mezo nem all szamokbol #pelda sztring sszefzesre $ echo '1 2 3 abc def ' | awk '{print $4 $5}' abcdef
Programszervez utastsok
Ezeket a C nyelvbl klcsnzi az awk, az albbiak hasznlhatak:
if (felttel) utasts [ else utasts ] while (felttel) utasts do utasts while (felttel) for (expr1; expr2; expr3) utasts break continue exit [ kifejezs ] { utasts }
Pl. az if hasznlata:
$ echo '2.2'| awk '{ if ($1==1) {print "igaz"} else\ {print "hamis"}}' hamis
A modern awk nyelv vezrlsi utastsnak tekinti a next utastst (fggvnyt) is (lsd be/ki fggvnyek). A next vgrehajtsakor az awk abbahagyja a kurrens rekord feldolgozst, jat vesz a bemenetrl s jraindtja vele az awk programot. Pl. ha arra szmtunk, hogy a bemenet minden sorban 4 mez van, s nem szeretnnk hibs feldolgozst vgezni, akkor olyan sorok rkezsekor amelyekben nincs 4 mez knnyen kikerlhetjk ezeket:
#!/usr/bin/awk -f { if (NF != 3) { print "Rossz mezszm, sor: " NR " : " $0 next
Opercis rendszerek I. - UNIX felhasznli ismeretek s hjprogramozs } } #... feldolgozsok itt kezddnek
Fggvnyek
A fggvnyeknek 2 kategrija van, a beptett s a felhasznl sajt fggvnyei. A fggvnyek fontosabb csoportjai a numerikus, a sztring s a be/ki fggvnyek.
Pl.
$ echo '' | awk '{print sin(1)}' 0.841471
Visszatrti a mit sztring pozcijt az hol sztringben, 0-t ha nincs benne. A sztring indexeket 1-tl szmolja a nyelv. A sztring hosszt trti vissza. Szubsztringet trt vissza az i-edik pozcitl kezdve, legtbb n karaktert. Kisbetss konvertl. Nagybetss konvertl. A C sprintf -jnek megfelel formatl fggvny.
length (s) substr(s, i [, n]) tolower(str) toupper(str) sprintf (format, kifejezs-lista) sub(regex, mivel, [miben])
Az miben sztringben behelyettesti a regex-re illeszked rszt a mivel sztringgel. Ha a miben paramter hinyzik, akkor a $0-ban helyettest. gsub (regex, mivel, A sub egyszer helyettest, a gsub minden tallatot tr. [miben]) Ha a miben paramtert nem adom meg, akkor a $0 -n dolgozik. Sikertelen trs utn 0-val trnek vissza, sikeres utn a sub 1-el, a gsub a cserk szmval. Itt is hasznlhat az & karakter a tallatra val visszautalsknt, akr a 9
sed s parancsban.
gensub(regex, mivel,hogyan, [miben])
Ez az ltalnos helyettest fggvny. Ugyangy mkdik mint a sub, de a hogyan mezben meg lehet adni ugyanazokat a kapcsolkat mint a sed helyettestsnl (n: hnyadik tallatot illetve g). Ugyanakkor a mivel sztringen hasznlhatak a \1, \2 stb. visszautalsok. Ez a fggvny a gawk kiterjesztse. Illeszti a regexp-et a sztringre: visszatrt egy szmot, ami 0 ha nincs illeszts illetve egy pozitv egsz szm ha van: ez pontosan az illeszts indexe a sztringben.
match(s,regexp)
Pl.:
$ echo 'elso masodik' | awk '\ {s=substr($2,5,3); s1=sprintf("%s%s", $1,s);\ s2=substr($2,0,4); print s1,s2}' elsodik maso
Abbahagyja a kurrens rekord feldolgozst, veszi a kvetkezt. A feldolgozs jraindul az els awk szablytl a BEGIN utn. Vigyzni kell hasznlatnl, pldul az albbi szkript semmit sem nyomtat a bemenetrl:
'{next;print $0}'
print print kifejezs-lista print kifejezs-lista > file printf (fmt, kifejezslista)
kirja a kurrens rekordot (a $0 rtkt) kirja egyms mell a kifejezsek rtkt a kirst llomnyba rja. A > jel ekvivalens a shell ltal hasznlt jellel, akr a >> is hasznlhat A C nyelv printf fggvnynek megfelel fggvny. Rszletes lerst lsd a kziknyvben.
Pl.:
$ echo '12.2261564 94.56256521' | awk '{\ printf("%2.2f %2.4f", $1,$2)}' 12.23 94.5626
A print fggvny nem csak a kimenetre, hanem csvezetkbe, llomnyba is tud rni:
$ echo '' | awk '{print "abc" $ echo '' | awk '{print "abc" close("grep -o 'abc'")}' > "file.txt"}' | "grep -o 'abc'";\
10
Egysoros pldaprogramok
A book.csv llomny knyvei sszrnak kiszmtsa az awk-val:
$ cat book.csv | awk -F '\t' 'BEGIN{sum=0}{sum=sum+$5}END{print sum}' 21561.6
getline vltoz < file j sort olvas a file llomnybl a vltoz vltozba. A mindig a terminlrl olvas close (file) flush (file)
Olvass utn a bemeneti llomnyt le kell zrni. Kirja a kimeneti llomny puffert, ha azt > vagy >> rssal nyitottuk meg.
Opercis rendszerek I. - UNIX felhasznli ismeretek s hjprogramozs BEGIN { sorok=0; while ( sorok < 4 ) { getline < "words" print $0 sorok++ } close("words") }
Sajt fggvnyek
A fggvnyek, mint ms nyelvben, szmtsokat csoportostanak, s nv szerinti meghvsukat teszik lehetv. Szintaktikailag van krlttk nhny furcsasg, amire oda kell figyelni. Sajt fggvnyeket az albbi szintaxissal hozhatunk ltre:
function nv (arg1, arg2, . . .) { utastsok; }
A ltrehozs helye az awk szablyokon kvl kell trtnjen a programban (programszervezsi szempontbl mindegy, hogy hol vannak a szablyokon kvl: nem szksges ket hasznlatuk eltt definilni. Ajnlott a program vgre tenni ket. Fontos: az awk szerzi figyelmeztetnek, hogy sajt fggvny hvsakor ne rjunk szkzt a fggvny neve s a zrjel kz, a:
fuggvenynev (
szerkezetben a szkzt a kontextustl fggen a nyelv rtkelheti gy is, mint egy sztring sszefzs opertort, ezrt j megszokni, hogy a nv s zrjel kz ne tegynk szkzt. Az argumentumok loklis vltozk lesznek a fggvny testben. Ezzel ellenttben, ha a fggvny belsejben vltozkat hozunk ltre, azok globlisan viselkednek, teht alkalmasak a fprogrammal 12
val kommunikcira. Azrt, hogy ezt (a fggvnyben ltrehozott vltozk lthatsga a fprogrambl) elkerljk, a fggvnyben hasznlt bels vltozkat is felsoroljuk az argumentumlistban, de rtkket nem adjuk meg hvskor, gy res vltozkk inicializldnak. Pl.:
function hatvany(i ,j, hat=i**j return hat } hat) {
vagy
vltoz=nv(kifejezs1, kifejezs2, ) amennyiben a fggvny return kifejezs ; utastssal lp ki, s egy rtket rendel hozz.
A fggvnyeket lehet rekurzv mdban hasznlni. Az albbi program szmok ngyzett listzza. Itt, br nem hasznltuk fel, a negy vltoz is ltrejn s lthat lesz a fprogramban mivel nevt nem adtuk meg a fggvny argumentumai kztt.
#!/usr/bin/awk -f BEGIN { for (i=0; i< 10; i++) { printf "%4d\t%4d\n", i,negyzet(i) } print "\na fprogrambl lthat negy:" negy } function negyzet(i) { negy=i*i return negy }
13
Tmbk az awk-ban
Az awk-ban hasznlt tmbk asszociatv tmbk, teht egy kulcshoz egy rtket rendelnek. Mivel az awk ltal hasznlt "alap" adattpus a sztring, ezrt a kulcsok mindig sztringek.
{ a[1]="elso" a["masodik"]="masodik" a[2]=122.3 } END { print a[1]; print a["masodik"] ; print a[2] } elso masodik 122.3
A kulcsoknak: -nem kell szekvencilisan egyms utn jnnik. gy knnyen el lehet lltani gynevezett "szrt" tmbket (sparse array). -tulajdonkppen akkor is sztringek, ha szmokat hasznlunk kulcsknt -az rtkek awk vltozk vagy konstansok A tmbk rtkeinek elrst megtehetjk ha ismerjk a kulcsokat illetve ha egy specilis for ciklust hasznlunk. A kulcsok ismeretben ez egyszer mint a fenti plda print utastsai esetben, vagy:
s=a["masodik"]
Amennyiben nemltez kulccsal hivatkozunk egy tmb elemeire, az awk nem ad hibt, a visszaadott rtk viszont az res sztring lesz. A tmbkre alkalmazhat for ciklus szintaxisa pedig az albbi:
for (kulcs_valtoz in tmb_vltoz) utasts
14
Lthat, hogy a kilistzott elemek nem olyan sorrendben jelennek meg, ahogy deklarltuk ket, hanem ahogyan az awk trolja az elemeket. Annyit tudunk, hogy a for ciklus vgigjr minden elemet, de hogy milyen sorrendben azt nem. Elemeket a tmbbl a delete fggvnnyel lehet trlni:
delete tmb_vltoz[kulcs]
Tudnunk kell, hogy a for ciklus esetben az iterci a kulcsokon lpked vgig, teht az rtkek listzshoz mindig hasznlnunk kell a kulcsokat. Ha valaki mgis egy bizonyos sorrendben akarja vgigjrni a tmbt, akkor sajt magnak kell azt megszerveznie. Ezt gy lehet a legknnyebben elrni, ha numerikus kulcsokat hasznl. Ilyenkor a tmb ltrehozsnl el kell lltani az egyms utni kulcsokat, majd ugyangy hivatkozni rjuk (lsd albb a pldt). Az elemek kapcsn a dntshelyzeteket egy specilis if utastssal lehet megoldani, amelynek szintaxisa az albbi:
if ( kulcs_vltoz in tmb_vltoz) utasts
a[1]="elso" a[3]="masodik" if ( 1 in a ) print "van a[1] elem a if ( "1" in a ) print "van a[2] elem a if ( 3 in a ) print "van a[3] elem a if ( 2 in a ) print "van a[2] elem a else print "nincs a[2] elem tombben" tombben" tombben" tombben" a tombben"
} Kimenet: van a[1] elem a van a[2] elem a van a[3] elem a nincs a[2] elem tombben tombben tombben a tombben
Trjnk vissza az elemek sorban val vgigjrhatsghoz. Az albbi pldban tudjuk, hogy a tmbnek csak numerikus kulcsai vannak, megnzzk elszr, hogy melyik a maximlis s minimlis kulcs, utna ezek kzt iterlunk, s csak azokkal a kulcsokkal dolgozunk, amelyek tnylegesen lteznek a tmbben. 15
Figyeljk meg a legutols if szerkezetet, amely tnylegesen csak azokat a tmbelemeket vlasztja ki, amelyek lteznek.
{ #letrehozom az elemet, figyeljuk meg, hogy a tomb hezagos a[3]="elso" a[2]="masodik" a[7]=55 #megprobalom kideriteni a maximalis es minimalis indexet # a +0 szerkezetet azert kell hasznalni az indexnel, #hogy # rakenyszeritsuk az awk-t, h. szamkent kezelje # az indexet min=0; max=0; # ez itt "tomb" for for (x in a) { if ( x+0 < min ) min=x if ( x+0 > max ) max=x } #ezek utan tudjuk a hatarokat, es normal for ciklussal #iteralhatunk for ( i =min; i<=max; i++) { # ez itt klasszikus for if ( i in a ) { print "a tomb kulcsa=" i " az erteke pedig=" a[i] } } } Kimenet: a tomb kulcsa=2 az erteke pedig=masodik a tomb kulcsa=3 az erteke pedig=elso a tomb kulcsa=7 az erteke pedig=55
16
Opercis rendszerek I. - UNIX felhasznli ismeretek s hjprogramozs $ echo 'abc, xyz. pqgr!'|awk '{ n=split($0, a, /[[:punct:]] /); \ print "a kapott elemek szama:" n ", az elemek: " a[1] " " a[2] " " a[3]}' a kapott elemek szama:3, az elemek: abc xyz pqgr!
Tbbdimenzis tmbk
A tbbdimenzis tmbk krdst a nyelv gy oldja meg, hogy a tmbk kulcsnak megadsnl vesszt hasznlhatunk elvlasztknt a kulcsknt megadott sztringben: gy az elvlasztott alsztringeket kln kulcsoknak tekinthetjk.
{a[6,7]=3; a[6,8]=4; print a[6,7]+a[6,8] }
Bibliogrfia
1. Bki Andrs: UNIX/Linux hjprogramozs, Kiskapu, 2002, Az awk c. fejezet 2. A GNU Awk felhasznli kziknyve, http://www.ms.sapientia.ro/~lszabo/oprendszer1/gawk/ letlteni az albbi cmrl lehet: http://hexahedron.hu/personal/peteri/gawk/index.html 3. Awk, HUP Wiki, http://wiki.hup.hu/index.php/Awk
17