Ero sivun ”Awk” versioiden välillä
p (linkit laajoihin manuaalisivuihin) |
Pb (keskustelu | muokkaukset) (wikitystä, joku awk:ta osaava voisi selkeyttää edelleen) |
||
Rivi 1: | Rivi 1: | ||
'''awk'''- ohjelmointikielen avulla | '''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 | 1 2 3 | ||
4 5 6 | 4 5 6 | ||
7 8 9 | 7 8 9 | ||
käsitellään seuraavanlaisen awk-ohjelman avulla: | |||
# tämä on awk ohjelma apu.awk | # tämä on awk ohjelma apu.awk | ||
# tämä begin lohko ajetaan kerran | # tämä begin-lohko ajetaan aluksi kerran | ||
BEGIN { | BEGIN { | ||
printf("alkutemput\n---------\n"); | 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 | # 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 | # vain riville joka alkaa numerolla 4. Ilman ehtoa se ajetaan kaikille riveille | ||
{ | { | ||
Rivi 30: | Rivi 31: | ||
} | } | ||
Kun tiedosto data.txt syötetään ylläkuvatulle awk-ohjelmalle komennolla | |||
awk -f apu.awk <data.txt</tt> | |||
on tulos seuraava: | |||
alkutemput | alkutemput | ||
---------- | ---------- | ||
Rivi 40: | Rivi 46: | ||
Seuraavalla komennolla etsitään pieniä, alle 100 merkin tiedostoja /etc-hakemistosta: | |||
ls -l /etc |awk '$5 < 100 {printf "%6s %s\n",$5,$8}' | ls -l /etc |awk '$5 < 100 {printf "%6s %s\n",$5,$8}' | ||
Edellä olevista esimerkeistä voi huomata että awk: | 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. | * 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. | * syöttödata pilkotaan automaattisesti $1..n numeroiduiksi kentiksi yleensä välilyönnin kohdalta. | ||
* | * virheilmoitusten tulkinta voi olla hankalaa | ||
Awk: | 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 | 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ä == | == Linkkejä == | ||
http://www.cs.uu.nl/~piet/docs/nawk/nawk_toc.html | *[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 | *[http://www.cs.utah.edu/dept/old/texinfo/gawk/gawk_toc.html Gawk-opas] | ||
Versio 1. huhtikuuta 2006 kello 20.53
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).