[[: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