[[:oktatas:linux|< Linux]]
====== Awk ======
* **Szerző:** Sallai András
* Copyright (c) 2011, Sallai András
* Szerkesztve: 2011, 2017
* Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|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