Felhasználói eszközök

Eszközök a webhelyen


oktatas:linux:awk

Különbségek

A kiválasztott változat és az aktuális verzió közötti különbségek a következők.

Összehasonlító nézet linkje

oktatas:linux:awk [2019/08/16 19:30] (aktuális)
admin létrehozva
Sor 1: Sor 1:
 +[[:​oktatas:​linux|<​ Linux]]
  
 +====== Awk ======
 +
 +  * **Szerző:​** Sallai András
 +  * Copyright (c) Sallai András, 2011, 2017
 +  * Licenc: GNU Free Documentation License 1.3
 +  * Web: http://​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:​
 +
 +
 +<code txt dolgozok.txt>​
 +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
 +</​code>​
 +
 +
 +
 +<code txt dolgozok2.txt>​
 +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
 +</​code>​
 +
 +
 +
 +===== grephez hasonló működés =====
 +
 +
 +<code bash>
 +awk /Szolnok/ dolgozok.txt
 +</​code>​
 +
 +
 +Az összes sor kiíratása:​
 +<code bash>
 +awk {print} dolgozok.txt
 +</​code>​
 +
 +
 +Adott sor kiíratása:​
 +<code bash>
 +awk '/​^005/​ {print}'​ dolgozok.txt
 +</​code>​
 +
 +
 +
 +===== Adott mező kiíratása =====
 +
 +<code bash>
 +awk '​{print $4}' dolgozok.txt
 +</​code>​
 +
 +
 +Eredmény:
 +<​code>​
 +Szolnok
 +Budapest
 +Szolnok
 +Győr
 +Budapest
 +Hatvan
 +Győr
 +Hatvan
 +Miskolc
 +Győr
 +Győr
 +Nyíregyháza
 +Győr
 +Szolnok
 +Szeged
 +Budapest
 +</​code>​
 +
 +
 +
 +
 +Mezőelválasztók beállítása:​
 +<code bash>
 +awk -F:  '​{print $3}' dolgozok2.txt
 +</​code>​
 +
 +Két mező kiíratása:​
 +<code bash>
 +awk '​{print $2$3}' dolgozok.txt
 +</​code>​
 +
 +Eredmény:
 +<code bash>
 +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
 +</​code>​
 +A vezeték- és keresztnevek szóköz nélkül kerülnek kiíratásra.
 +
 +
 +Mezők tagolása:
 +<code bash>
 +awk '​{print $2" "​$3}'​ dolgozok7.txt
 +</​code>​
 +
 +Eredmény:
 +<code bash>
 +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
 +</​code>​
 +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:
 +<code bash>
 +awk '$6 < 200000 {print $6}' dolgozok.txt
 +</​code>​
 +
 +Eredmény:
 +<​code>​
 +123000
 +120000
 +130000
 +</​code>​
 +
 +===== Számítások =====
 +
 +A fenti állomány tartalmát szeretnénk összegezni.
 +<code bash>
 + awk '​{print osszeg += $6}' dolgozok.txt
 +</​code>​
 +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:
 +<code bash>
 + awk '​{osszeg += $6} END{print osszeg}'​ dolgozok.txt
 +</​code>​
 +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:
 +<code bash>
 +awk '​{osszeg += $6}  \
 +END{print "​Összeg:​ " osszeg}'​ dolgozok.txt
 +</​code>​
 +
 +
 +Az eddig ismereteinket felhasználva akár átlagot is számolhatunk:​
 +
 +Átlag:
 +<code bash>
 +
 +awk '​{osszeg += $6; num++} \
 +END {print "​Összeg:​ " osszeg; print "​Száma:​ " ​ num; \
 +print "​Átlag:​ " osszeg / num}' dolgozok.txt
 +</​code>​
 +
 +Eredmény:
 +<code bash>
 +Összeg: 18853400
 +Száma: 71
 +Átlag: 265541
 +</​code>​
 +
 +===== Keverés =====
 +
 +<code txt szamok.txt>​
 +1
 +2
 +3
 +4
 +5
 +6
 +
 +</​code>​
 +
 +
 +Állomány sorainak megkeverése:​
 +<code bash>
 +awk '{ print rand(), $1 }' sorted.lst |  sort -n | cut -d " " -f 2
 +</​code>​
 +
 +Lehetséges eredmény:
 +<​code>​
 +4
 +2
 +1
 +3
 +6
 +5
 +</​code>​
 +
 +===== 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. ​
 +
 +<code bash>
 +awk -F: 'BEGIN {print "​Név\t\tFizetés"​} $6 < 200000 { print $2"​\t"​$6}'​ dolgozok2.txt
 +</​code>​
 +
 +A BEGIN{} zárójelei között adjuk meg, hogy mi történjen az oszlopok
 +feldolgozása előtt. ​
 +
 +
 +Eredmény:
 +<​code>​
 +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
 +</​code>​
 +
 +
 +===== Program =====
 +
 +A következőkben awk programokat készítünk. ​
 +
 +<code awk listaz.awk>​
 +#​!/​usr/​bin/​awk -f
 +
 +{
 +    print $2
 +}
 +</​code>​
 +
 +Futtatás:
 +<code bash>
 +./​listaz.awk dolgozok.txt
 +</​code>​
 +
 +
 +
 +<code awk kisfizu.awk>​
 +#​!/​usr/​bin/​awk -f
 +
 +BEGIN {
 +    FS= ":"​
 +}
 +
 +
 +$6 < 200000 {
 +    print $6
 +}
 +</​code>​
 +
 +Ebben az awk programban beállítjuk a mezőelválasztót,​ amelyet
 +az FS változó jelképez.
 +
 +
 +Futtatás:
 +<code bash>
 +./​kisfizu.awk dolgozok2.txt
 +</​code>​
 +
 +
 +===== Irodalom =====
 +
 +  * http://​www.gnu.org/​software/​gawk/​manual/​html_node/​
 +  * http://​www.savs.hcc.edu.tw/​~chuavv/​awk/​nawk_toc.html
oktatas/linux/awk.txt · Utolsó módosítás: 2019/08/16 19:30 szerkesztette: admin