Ero sivun ”Awk” versioiden välillä
(uuteen hienoon luokkaan) |
pEi muokkausyhteenvetoa |
||
Rivi 60: | Rivi 60: | ||
Awk-ohjelmissa ei ole yleensä mitään rajoitusta käsiteltävien tiedostojen koolle, koska niitä käsitellään vain riveinä ja syöttö/tulostus putkina/virtoina. Awk-ohjelmat pystyvät käsittelemään varsin helposti hyvinkin suuria syöttö/tulostustiedostoja (satoja megatavuja). | Awk-ohjelmissa ei ole yleensä mitään rajoitusta käsiteltävien tiedostojen koolle, koska niitä käsitellään vain riveinä ja syöttö/tulostus putkina/virtoina. Awk-ohjelmat pystyvät käsittelemään varsin helposti hyvinkin suuria syöttö/tulostustiedostoja (satoja megatavuja). | ||
== | ==Aiheesta muualla== | ||
*[http://www.cs.uu.nl/~piet/docs/nawk/nawk_toc.html Awk-opas] | *[http://www.cs.uu.nl/~piet/docs/nawk/nawk_toc.html Awk-opas] |
Versio 29. syyskuuta 2007 kello 13.28
awk-ohjelmointikielen avulla voi helposti muuntaa tekstitiedoston rakennetta. awk ja sen laajennettu versio gawk kuuluvat Unix/Linux-käyttäjän perustyökaluihin silloin, kun kyseessä on:
- puhtaan tekstitiedoston muuntaminen riveittäin toiseen muotoon
- rivien suodattaminen pois tekstistä tavalla, johon grep ei kykene
- laskujen laskeminen riveillä olevilla numeroilla
Käyttö
Tiedostoa data.txt, jonka sisältö on seuraava:
1 2 3 4 5 6 7 8 9
käsitellään seuraavanlaisen awk-ohjelman avulla:
# tämä on awk ohjelma apu.awk # tämä begin-lohko ajetaan aluksi kerran BEGIN { printf("alkutemput\n---------\n"); } # Tässä välissä on varsinainen awk-ohjelmien 'äly'. Näitä lohkoja # voi olla useita, ja niiden eteen voi laittaa ehdon, jolla ko. rivi ajetaan. # Jos alla olevan lohkon alun muuttaisi $1 == 4 { niin lohko ajettaisiin # vain riville joka alkaa numerolla 4. Ilman ehtoa se ajetaan kaikille riveille { printf "[%s] [%s] [%s] -> %d\n",$1,$2,$3,$1+$2+$3 } # tämä end lohko ajetaan kerran lopuksi END { printf("---------\nlopputemput\n"); }
Kun tiedosto data.txt syötetään ylläkuvatulle awk-ohjelmalle komennolla
awk -f apu.awk <data.txt>
on tulos seuraava:
alkutemput ---------- [1] [2] [3] -> 6 [4] [5] [6] -> 15 [7] [8] [9] -> 24 ---------- lopputemput
Seuraavalla komennolla etsitään pieniä, alle 100 merkin tiedostoja /etc-hakemistosta:
ls -l /etc |awk '$5 < 100 {printf "%6s %s\n",$5,$8}'
Edellä olevista esimerkeistä voi huomata, että awk:n syntaksi on lähellä C:n syntaksia. Aloittelija saattaa kuitenkin yllättyä siitä että:
- muuttujilla ei ole tyyppiä ja muunnokset tehdään automaattisesti.
- taulukkoindekseinä voi käyttää periaatteessa mitä tahansa, tästä on paljon hyötyä niissä tehtävissä, joihin awk on ensisijaisesti tarkoitettu
- syöttödata pilkotaan automaattisesti $1..n numeroiduiksi kentiksi yleensä välilyönnin kohdalta.
- virheilmoitusten tulkinta voi olla hankalaa
Awk:n on sanottu joskus olevan "write only language", ja sitä se onkin jos yrittää saada todella monimutkaisesta awk-ohjelmasta selkoa. Omat ohjelmat kannattaa tehdä siten, että kirjoittaa ja testaa ohjelman rivi kerrallaan. Awk on parhaimmillaan lyhyissä muutaman rivin ohjelmissa.
Awk-ohjelmissa ei ole yleensä mitään rajoitusta käsiteltävien tiedostojen koolle, koska niitä käsitellään vain riveinä ja syöttö/tulostus putkina/virtoina. Awk-ohjelmat pystyvät käsittelemään varsin helposti hyvinkin suuria syöttö/tulostustiedostoja (satoja megatavuja).