Ero sivun ”Awk” versioiden välillä
Ei muokkausyhteenvetoa |
p (Käyttäjän Peelo (keskustelu) muokkaukset palautettiin viimeisimpään käyttäjän Pb tekemään muutokseen.) |
||
Rivi 1: | Rivi 1: | ||
'''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</tt> | |||
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). | |||
== Linkkejä == | |||
*[http://www.cs.uu.nl/~piet/docs/nawk/nawk_toc.html Awk-opas] | |||
*[http://www.cs.utah.edu/dept/old/texinfo/gawk/gawk_toc.html Gawk-opas] | |||
[[Luokka:Komentorivi]] | |||
[[Luokka:Ohjelmat]] |
Versio 5. tammikuuta 2007 kello 11.41
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).