Tips en Trucs 2011

Awk zelfstudie

Zoals elke andere programmeertaal kent Awk door de gebruiker gedefinieerde plaatshouders (variabelen) en ingebouwde plaatshouders.

Deze tip toont hoe je plaatshouders in awk definieert en gebruikt.

De volgende voorbeelden tonen hoe je gebruikers gedefinieerde plaatshouders in awk kunt gebruiken.

Factuur met boeken

In dit voorbeeld gebruiken we het tekstbestand boekdetails.txt met per record (boek, regel) de velden (details): boeknummer, titel, hoeveelheid en prijs in euro.

dany@Dany-HP:~> cat boekdetails.txt
1 Linux-programming 2 45
2 Advanced-Linux 3 30
3 Computer-Networks 4 40
4 OOAD&UML 3 45
5 Java 5 20

Ons Awk script leest en verwerkt de gegevens uit het bestand boekdetails.txt, waarmee een rapport met per boek de totale prijs en de totale prijs van alle boeken samen.

Naast het gebruik van awk als opdracht in een terminal, kan awk met de optie -f zijn opdrachten uit een bestand halen.
Schrijfwijze: awk -f script-bestandsnaam gegevens-bestandsnaam

Het Awk script met de factuur berekeningen voor de boeken wordt dan:

dany@Dany-HP:~> cat boek-berekening.awk
BEGIN {
  totaal=0;
}
{
  itemnr=$1;
  boek=$2;
  boektotaal=$3*$4;
  totaal=totaal+boektotaal;
  print itemnr," ", boek,"\t","€"boektotaal;
}
END {
  print "Totaal bedrag = €"totaal;
}
In het script,

Hieronder zie je het rapport dat door het uitvoeren van het Awk script wordt aangemaakt.

dany@Dany-HP:~>awk -f boek-berekening.awk boekdetails.txt
1   Linux-programming    €90
2   Advanced-Linux       €90
3   Computer-Networks    €160
4   OOAD&UML     €135
5   Java         €100
Totaal bedrag = €575

Puntenboek

Dit voorbeeld gebruikt het invoerbestand cursisten-evaluaties.txt met de volgende velden: naam, nummer, resultaat evaluatie 1, resultaat evaluatie 2, resultaat evaluatie 3.

dany@Dany-HP:~> cat cursisten-evaluaties.txt
John 2143 78 84 77
George 2321 56 58 45
Ringo 2122 38 37 65
Erwin 2537 78 67 45
Dirk 2415 30 47 20

Ons Awk script berekent en toont het gemiddelde resultaat van elke cursist.

dany@Dany-HP:~> cat cursist.awk
BEGIN {
  test1=0;
  test2=0;
  test3=0;
  print "Naam\tNummer\t Gemiddelde resultaat";
}
{
  totaal=$3+$4+$5;
  test1=test1+$3;
  test2=test2+$4;
  test3=test3+$5;
  print $1"\t"$2"\t",totaal/3;
}
END{
  print "Gemiddelde voor de eerste evaluatie="test1/NR;
  print "Gemiddelde voor de tweede evaluatie="test2/NR;
  print "Gemiddelde voor de derde evaluatie="test3/NR;
}
In het script,

Dit wordt het resultaat:

dany@Dany-HP:~> awk -f cursist.awk cursisten-evaluaties.txt 
Naam    Nummer   Gemiddelde resultaat
John    2143     79.6667
George  2321     53
Ringo   2122     46.6667
Erwin   2537     63.3333
Dirk    2415     32.3333
Gemiddelde voor de eerste evaluatie=56
Gemiddelde voor de tweede evaluatie=58.6
Gemiddelde voor de derde evaluatie=50.4

Een cursistenlijst in het HTML-formaat.

Ons Awk script moet nu een cursistenlijst met namen en bijhorende nummers aanmaken. We gebruiken daarbij het gegevensbestand van het vorige voorbeeld.

dany@Dany-HP:~> cat cursistenlijst.awk
BEGIN{
  title="AWK";
  print "<html>\n<title>"title"</title><body bgcolor=\"#ffffff\">\n<table border=1><th  colspan=2 align=centre>Cursistenlijst</th>";
}
{
  naam=$1;
  nummer=$2;
  print "<tr><td>"naam"</td><td>"nummer"</td></tr>";
}
END {
  print "</table></body>\n</html>";
}

De plaatshouders naam en nummer worden door Awk als tekenreeksen (strings) behandeld omdat ze in een html tekenreeks verwerkt worden. Het resultaat:

dany@Dany-HP:~> awk -f cursistenlijst.awk cursisten-evaluaties.txt
<html>
<title>AWK</title><body bgcolor="#ffffff">
<table border=1><th  colspan=2 align=centre>Cursistenlijst</th>
<tr><td>John</td>td>2143</td></tr>
<tr><td>George</td><td>2321</td></tr>
<tr><td>Ringo</td><td>2122</td></tr>
<tr><td>Erwin</td><td>2537</td></tr>
<tr><td>Dirk</td><td>2415</td></tr>
</table></body>
</html>

Deze uitvoer kun je opslaan, waarbij je de volgende html tabel krijgt:

Cursistenlijst
John2143
George2321
Ringo2122
Erwin2537
Dirk2415