Ero sivun ”Awk” versioiden välillä

Linux.fista
Siirry navigaatioon Siirry hakuun
p (awk sivu luotu)
Rivi 7: Rivi 7:


== Esimerkkejä miten awkia käytetään ==
== Esimerkkejä miten awkia käytetään ==
Laskuesimerkki


  Tiedoston data.txt sisältö on:
  Tiedoston data.txt sisältö on:
Rivi 15: Rivi 13:
  7 8 9
  7 8 9


  niin awk ohjelma apu.awk:
  # tämä on awk ohjelma apu.awk
# tämä begin lohko ajetaan kerran aluksi
  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
# 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
   printf "[%s] [%s] [%s] ->  %d\n",$1,$2,$3,$1+$2+$3
  }
  }
# tämä end lohko ajetaan kerran lopuksi
  END {
  END {
     printf("---------\nlopputemput\n");
     printf("---------\nlopputemput\n");
  }
  }


muuntaa sen komennolla 'awk -f apu.awk <data.txt' muotoon:
Komento <tt>awk -f apu.awk <data.txt</tt> tuottaa tällaisen:
  alkutemput
  alkutemput
  ----------
  ----------

Versio 1. huhtikuuta 2006 kello 09.21

awk- ohjelmointikielen avulla voit helposti muuntaa tekstitiedoston rakennetta. awk ja sen laajennettu versio gawk kuuluvat unix/linux käyttäjän perustyökaluihin silloin kun sinun tarvitsee:

  • muuntaa puhdas tekstitiedosto riveittäin toiseen muotoon
  • suodattaa tekstistä rivejä pois tavalla johon [grep] ei kykene
  • laskea laskuja riveillä olevista numeroista


Esimerkkejä miten awkia käytetään

Tiedoston data.txt sisältö on:
1 2 3
4 5 6
7 8 9
# tämä on awk ohjelma apu.awk
# tämä begin lohko ajetaan kerran aluksi
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");
}

Komento awk -f apu.awk <data.txt tuottaa tällaisen:

alkutemput
----------
[1] [2] [3] ->  6
[4] [5] [6] ->  15
[7] [8] [9] ->  24
----------
lopputemput


Tällä komennolla etsit 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:in 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ää 'mitä tahansa', tästä on paljon hyötyä siinä mihin awk on tarkoitettu
  • syöttödata pilkotaan automaattisesti $1..n numeroiduiksi kentiksi yleensä välilyönnin kohdalta.
  • virheilmoituksien tulkinta voi olla hankalaa

Awk:ia 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ävä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 megoja).