AWK on tekstitiedon käsittelyyn suunniteltu kieli. Se on nimetty luojiensa Alfred Ahon, Peter Weinbergerin ja Brian Kernighanin mukaan. AWK on melko pieni kieli ja se on helppo oppia, mikä tekee siitä ihanteellisen työkalun nopeaan ja helppoon tekstinkäsittelyyn. Sen pääkäyttötarkoitus on tiedon erottaminen taulukkomaisesta sisääntulosta.
Koska AWK-kielellä kirjoitetut ohjelmat ovat yleensä aika pieniä, niitä kirjoitetaan yleensä suoraan komentoriviltä. Tietenkin suurempien skriptien tallentaminen tekstitiedostoina on myös mahdollista.
Seuraavissa kappaleissa esittelemme AWK:n perusteet kolmen yksinkertaisen esimerkin avulla. Niistä kaikki käsittelevät seuraavaa tekstitiedostoa (joka sisältää viisi kaikkien aikojen korkeinta pistetulosta Donkey Kong -videopelissä toukokuuhun 2009 mennessä):1050200 Billy Mitchell 2007 1049100 Steve Wiebe 2007 895400 Scott Kessler 2008 879200 Timothy Sczerby 2001 801700 Stephen Boyer 2007
Tämä tiedosto on jaettu kenttiin. Ensimmäinen jokaisen rivin kenttä sisältää vastaavan pistemäärän, toinen ja kolmas kenttä sisältävät pistemäärän tehneen henkilön nimen, ja neljäs ja viimeinen kenttä joka rivillä sisältävät vuoden, jona pistemäärä saavutettiin. Voit kopioida ja liittää tekstin tekstitiedoston yläpuolelle ja nimetä sen vaikkapa tiedostoksi highscores.txt, jotta voit kokeilla seuraavia esimerkkejä.
Esimerkki 1
Sanotaanpa, että tahdomme tulostaa vain pistemäärät, jotka ovat suurempia kuin 1 000 000 pistettä. Lisäksi tahdomme ainoastaan pistemäärän saavuttaneiden ihmisten etunimet. AWK:lla tämä tieto saadaan näin:
$ awk '$1 > 1000000 { print $2, $1 }' highscores.txt Billy 1050200 Steve 1049100
Kokeile!
Pieni komentorivillä syöttämämme AWK-ohjelma sisältää kaksi osaa:
- Ensimmäinen osa ennen aaltosulkeita ($1 > 1000000) sanoo: "Tee tämä kaikille riveille, joiden arvo kentässä numero 1 on suurempi kuin 1 000 000."
- Aaltosulkujen sisällä oleva osa (print $2, $1) sanoo: "Tulosta kenttä numero 2, jota seuraa kenttä numero 1."
Yhdistetty ohjelma sanoo: "Kaikista riveistä, joiden ensimmäisen kentän arvo on suurempi kuin 1 000 000, tulosta rivin toinen arvo, jota seuraa rivin ensimmäinen arvo." (Huomaa, että komentoriviltä syötetyt AWK-ohjelmat on yleensä suljettu heittomerkkeihin, jotta komentotulkki ei tulkitse niitä.)
Kuten olemme nähneet edellisessä esimerkissä, AWK-lauseen rakenne on seuraava:
rakenne { toiminta }
Ilmaisu rakenne tarkentaa ehdon, joka täytyy täyttää, jotta toimenpide suoritetaan. AWK-ohjelmat koostuvat mistä tahansa määrästä näitä lauseita. (Edellä esitelty ohjelma sisältää vain yhden lauseen.) AWK-ohjelma tekee periaatteessa seuraavat asiat:
- Se lukee sisääntulon (esimerkiksi tiedoston tai tekstivirran standardisisääntulosta) rivi riviltä.
- Jokaisella rivillä AWK tekee lauseet, joiden ehto/hahmo täyttyy.
Yksinkertaista, eikö totta?
Esimerkki 2
Katsotaanpa toista esimerkkiä:
$ awk '$4 == 2007 { print "Sija", NR, "-", $3 }' highscores.txt Sija 1 - Mitchell Sija 2 - Wiebe Sija 5 - Boyer
tämä ohjelma sisältää taas yhden lauseen, joka voidaan ilmaista näin: "Tulosta sana 'Sija' ja muuttujan 'NR' arvo, viiva ('-') ja kenttä numero 3 jokaiselta riviltä, jonka kentän numero 4 arvo on 2007."
Tämä pikku ohjelma tulostaa kaikkien vuonna 2007 ennätyksen tehneiden sukunimet ja heidän sijaintinsa korkeimpien tulosten listassa.
Kuinka AWK tietää kuinka hyvin ennätystuloksen tehneet ovat sijoittuneet? Kun taulukko tutkitaan, jokaisen korkeimmat pisteet tehneen pelaajan sija vastaa rivinumeroa. AWK voi päästä käsiksi jokaisen rivin numeroon sisäänrakennetun muuttujan NR (Number of Row, rivinumero) avulla. AWK:ssa on paljon hyödyllisiä sisäänrakennettuja muuttujia, jotka löydät sen dokumentaatiosta.
Esimerkki 3
Kolmas ja viimeinen esimerkki on hieman monnimutkaisempi kuin kaksi edellistä, sillä se sisältää kaikkiaan kolme AWK-lausetta:
$ awk 'BEGIN {print "Viisi parasta Donkey Kongin pelaajaa ovat saavuttaneet yhteensä:"} {total += $1} END {print total, "pistettä!"}' highscores.txt
Tämä tulostaa seuraavan:
Viisi parasta Donkey Kongin pelaajaa ovat saavuttaneet yhteensä: 4675600 pistettä
Jaetaanpa tämä ohjelma kolmeen osaan/lauseeseen (jotka olemme kirjoittaneet yhdellä komentorivillä):
Ensimmäinen lauseke
hahmo: BEGIN
toiminto: print "Viisi parasta Donkey Kongin pelaajaa ovat saavuttaneet yhteensä:"
Toinen lauseke
hahmo: ei mitään (= suorita aina toiminto)
toiminto: lisää kentän numero 1 arvo muuttujaan total
Kolmas lauseke
hahmo: END
toiminto: tulostaa muuttujan total arvon, jota seuraa merkkijono "pistettä"
Katsotaanpa nyt mitä tässä uudessa lyhyessä AWK-ohjelmassa on.
Ensinnäkin rakenteilla BEGIN ja END on erikoinen merkitys: BEGIN -komennon jälkeen tuleva toiminto suoritetaan ennen kuin mitään syötettä luetaan ja END-komennon jälkeen tuleva toiminto suoritetaan AWK:n lopetettua syötteen lukemisen.
Toisessa lauseessa voimme havaita, että AWK-lause ei tarvitse hahmoa, ainoastaan toiminto on vaadittu. Jos lause ei sisällä hahmoa, lauseen ehto on aina voimassa ja AWK suorittaa toiminnon jokaiselle sisääntulon riville.
Lopulta olemme käyttäneet omaa muuttujaamme ensimmäistä kertaa. Muuttuja on nimeltään total. AWK-muuttujia ei tarvitse julistaa erikseen: voit luoda uusia muuttujia yksinkertaisesti käyttämällä niitä. Esimerkkiohjelmassamme muuttujan total arvo alkaa nollasta ja nousee yhdellä jokaista syötteen riviä kohden. Operaattori += merkitsee "lisää oikealla oleva matemaattinen ilmaisu vasemmalla olevaan muuttujaan."
Kun kaikki sisääntulon rivit on luettu, total sisältää kaikkien kentän 1 arvojen summan, eli kaikkien huipputulosten summan. Lause END tulostaa muuttujan total arvon, jota seuraa merkkijono "pistettä.
Minne menemme täältä?
Olemme nähneet, että AWK on hauska ja helppokäyttöinen pikku ohjelmointikieli, jota on sovellettu suureen määrään tiedonuuttamistehtäviä. Tämä lyhyt johdanto AWK-ohjelmointikieleen ei tietenkään voi olla alkupalaa kummempi. Jos tahdot oppia enemmän, suosittelemme että katsot GAWKia, GNU-versiota AWKista. Se on yksi monipuolisimmista kielen versioista, sen mukana tulee laaja ja helppolukuinen käyttöopas (katso http://www.gnu.org/software/gawk/manual/).