< Linux

Awk

Szerző: Sallai András

Copyright © 2011, Sallai András

Szerkesztve: 2011, 2017

Licenc: CC BY-SA 4.0

Web: https://szit.hu

Bevezetés

Az awk egy mintakereső és -feldolgozó nyelv. Rövid gyorstalpalót találunk itt mintákkal.

Legyen „dol” néven kezdődő állomány amelyen végrehajtjuk feladatainkat:

001 Rigó Dániel Szolnok 1969-10-8 720000 002 Nagy Tamás Budapest 1953-11-26 12300 003 Gyenge Tamás Szolnok 1974-09-8 740000 004 Kiss Tamás Győr 1968-02-16 290000 005 Budai Károly Budapest 1986-03-20 470000 006 Bodnár Zoltán Hatvan 1962-08-17 330000 007 Vitéz László Győr 1983-03-15 590000 008 Veres Gábor Hatvan 1975-02-13 210000 009 Kiss Béla Miskolc 1953-07-1 730000 010 Gyenge Zoltán Győr 1953-02-7 240000 011 Róka László Győr 1980-02-9 120000 012 Budai Ferenc Nyíregyháza 1972-06-24 630000 013 Nagy György Győr 1977-01-26 600000 014 Vitéz László Szolnok 1974-06-2 700000 015 Varga József Szeged 1968-03-27 130000 016 Kis Géza Budapest 1971-08-1 720000
001:Varga Dániel:Győr:Rezgő köz u.36:1970-03-25:10000 002:Fényes Gábor:Szeged:Orsovahida utca u.57:1976-05-7:140000 003:Szalai Tamás:Budapest:Vértanú utca u.48:1984-02-1:600000 004:Róka József:Budapest:Fogarasi park u.93:1985-03-21:320000 005:Horváth Géza:Hatvan:Kiránduló utca u.100:1978-09-13:40000 006:Szántó Tamás:Nyíregyháza:Sáránd utca u.117:1984-07-25:710000 007:Erdős Lajos:Budapest:Szalamandra út u.72:1975-09-2:610000 008:Szabó Gábor:Hatvan:Szerelmey Miklós utca u.46:1957-02-13:750000 009:Takács Tamás:Budapest:Szalóki utca u.3:1980-06-9:680000 010:Horváth Lajos:Győr:Szabó Lőrinc utca u.6:1950-07-14:340000 011:Horváth Dániel:Szeged:Hengermű utca u.22:1979-09-26:480000 012:Veres Béla:Budapest:Kerekeskút utca u.107:1986-01-19:480000 013:Erdős Dániel:Szeged:Rétihéja utca u.22:1958-10-7:270000 014:Illés Gábor:Szeged:Nagykikinda utca u.28:1973-01-24:180000 015:Szalai Gábor:Hatvan:Hangos utca u.30:1951-09-20:170000 016:Kiss Zoltán:Miskolc:Luther utca u.114:1968-10-25:90000 017:Fényes Géza:Miskolc:Apahida utca u.101:1978-10-2:660000 018:Vitéz Ferenc:Győr:Mátyás király út u.19:1969-06-23:640000

grephez hasonló működés

awk /Szolnok/ dolgozok.txt

Az összes sor kiíratása:

awk {print} dolgozok.txt

Adott sor kiíratása:

awk '/^005/ {print}' dolgozok.txt

Adott mező kiíratása

awk '{print $4}' dolgozok.txt

Eredmény:

Szolnok
Budapest
Szolnok
Győr
Budapest
Hatvan
Győr
Hatvan
Miskolc
Győr
Győr
Nyíregyháza
Győr
Szolnok
Szeged
Budapest

Mezőelválasztók beállítása:

awk -F: '{print $3}' dolgozok2.txt

Két mező kiíratása:

awk '{print $2$3}' dolgozok.txt

Eredmény:

RigóDániel NagyTamás GyengeTamás KissTamás BudaiKároly BodnárZoltán VitézLászló VeresGábor KissBéla GyengeZoltán RókaLászló BudaiFerenc NagyGyörgy VitézLászló VargaJózsef KisGéza

A vezeték- és keresztnevek szóköz nélkül kerülnek kiíratásra.

Mezők tagolása:

awk '{print $2" "$3}' dolgozok7.txt

Eredmény:

Rigó Dániel Nagy Tamás Gyenge Tamás Kiss Tamás Budai Károly Bodnár Zoltán Vitéz László Veres Gábor Kiss Béla Gyenge Zoltán Róka László Budai Ferenc Nagy György Vitéz László Varga József Kis Géza

A vezeték- és keresztnevek között szóköz van.

Feltétel megadása

A következőkben csak azon sorok fizetés mezőit szeretnénk kiíratni, amelyeknél az érték kisebb mint 200000. A feladat megoldása:

awk '$6 < 200000 {print $6}' dolgozok.txt

Eredmény:

123000
120000
130000

Számítások

A fenti állomány tartalmát szeretnénk összegezni.

awk '{print osszeg += $6}' dolgozok.txt

A megoldás a helyes eredményt végül megadja, és végig látjuk hogyan alakul az osszeg nevű változó értéke. Legtöbbször azonban nekünk ez felesleges, csak a végeredményt szeretnénk látni.

Akkor szeretnénk utasítást végrehajtani, ha a sorokon végig mentünk:

awk '{osszeg += $6} END{print osszeg}' dolgozok.txt

Az „END után írt kapcsos-zárójelek közzé olyan utasításokat írhatunk, amelyek csak akkor hajtódnak végre, ha az awk már végig ment az összes soron.

A megoldás teljesebb lehet, ha valamilyen tájékoztató szöveget is írunk a képernyőre, hogy a kapott érték mit is jelent.

Tájékoztató szöveg:

awk '{osszeg += $6} \ END{print "Összeg: " osszeg}' dolgozok.txt

Az eddig ismereteinket felhasználva akár átlagot is számolhatunk:

Átlag:

awk '{osszeg += $6; num++} \ END {print "Összeg: " osszeg; print "Száma: " num; \ print "Átlag: " osszeg / num}' dolgozok.txt

Eredmény:

Összeg: 18853400 Száma: 71 Átlag: 265541

Keverés

1 2 3 4 5 6

Állomány sorainak megkeverése:

awk '{ print rand(), $1 }' sorted.lst | sort -n | cut -d " " -f 2

Lehetséges eredmény:

4
2
1
3
6
5

Feldolgozás előtt

A neveket és a fizetéseket szeretnénk kiíratni, de csak ha a fizetés kisebb mint 200000, a két oszlopot pedig felirattal szeretnénk ellátni.

awk -F: 'BEGIN {print "Név\t\tFizetés"} $6 < 200000 { print $2"\t"$6}' dolgozok2.txt

A BEGIN{} zárójelei között adjuk meg, hogy mi történjen az oszlopok feldolgozása előtt.

Eredmény:

Név	Fizetés
Varga Dániel	10000
Fényes Gábor	140000
Horváth Géza	40000
Illés Gábor	180000
Szalai Gábor	170000
Kiss Zoltán	90000

Program

A következőkben awk programokat készítünk.

#!/usr/bin/awk -f { print $2 }

Futtatás:

./listaz.awk dolgozok.txt
#!/usr/bin/awk -f BEGIN { FS= ":" } $6 < 200000 { print $6 }

Ebben az awk programban beállítjuk a mezőelválasztót, amelyet az FS változó jelképez.

Futtatás:

./kisfizu.awk dolgozok2.txt

Irodalom

http://www.gnu.org/software/gawk/manual/html_node/

http://www.savs.hcc.edu.tw/~chuavv/awk/nawk_toc.html