domenica 11 novembre 2012

Un po' di AWK. Undicesima parte

Oggi parliamo del ciclo While.

La sintassi all'interno di uno script è (più o meno) così.
Tutto while deve essere racchiuso tra parentesi graffe.

{
while(condizione)
    azione
}


Partiamo dalla seguente tabella (tabella.txt)

Marco 1200 1400 1000 1500 1800 1400 1000
Luca  1800 2300 2000 1000 1000 1150 1230
Carlo 2000 1200 1000 1000 1200 1100 2000
Nino  1000 1250 1900 1100 1350 1100 1290
Luigi 1500 1000 1250 1100 1200 1120 1000
Ennio 2000 1000 1550 1300 1000 1100 0

Nelle colonne successive alla prima ci sono delle cifre che rappresentano le retribuzioni mensili percepite.

Il primo script che andremo a costruire andrà a sommare i campi che vanno da $2 a $8 in modo che ogni nome venga seguito dalla somma delle varie retribuzioni mensili. Es. Marco in un intervallo di mesi ha guadagnato un totale di 9300 euro; Luca, nello stesso intervallo, ha guadagnato un totale di 10480 euro e così via.

#!/usr/bin/awk -f

BEGIN {
       print " \f##########RETRIBUZIONE TOTALE###########\n"
}
{ 
  i=2; totale=0
  while (i<=NF) {
      totale=totale+$i;
      i++
  }
  print "\nil Signor",$1, "in sette mesi ha guadagnato", totale, "euro"
}

Il ciclo funziona in questo modo, anzitutto il valore della variabile i è impostato su 2. Questo perchè il primo campo utile da sommare è $2. Infatti in $1 ci sono i nomi. Poi while verifica se il valore della variabile i è inferiore o uguale al numero dei campi (NF). E fino a quando il valore della variabile i è inferiore o uguale al numero dei campi, verranno eseguite le varie azioni constituenti il corpo del ciclo. Nel nostro esempio, totale=totale+$i. Intanto i++, ad ogni iterazione, incrementa di una unità il valore della variabile i. Le iterazioni terminano quando i>NF

Lo script va salvato nella stessa cartella contenente il file tabella.txt

Va reso eseguibile

$ chmod +x while0.awk

ed eseguito

$ ./while0.awk tabella.txt
Ma si potrebbe chiedere anche quanto i vari signori hanno guadagnato i primi quattro mesi. (while1.awk)

#!/usr/bin/awk -f
{
    i = 2; totale=0
    while (i <= 5) {
          totale=totale+$i;
           i++
    }
    print "\nil Signor",$1, "nei primi quattro mesi ha guadagnato", totale, "euro"
 }

Lo stesso script può essere scritto anche così (while2.awk)

#!/usr/bin/awk -f
{
  i=2; totale=0
  while (1) {
       totale=totale+$i;
       i++
       if ( i > 5 ) {
          break
        }    
  } 
  print "\fil Signor",$1, "nei primi quattro mesi ha guadagnato", totale, "euro"    
}

In questo caso abbiamo un ciclo iterativo perpetuo (il numero 1 equivale a vero per AWK), che viene interrotto dall'istruzione break. Infatti se (if) i>5, esci dal ciclo (break).

Per chiudere non poteva mancare la sequenza di fibonacci. :)

$ awk 'BEGIN {a=1;b=1; while(++i<=15){print a; c=a;a=a+b;b=c}}'


Ok, per oggi basta. La prossima volta continuiamo con i cicli. Ciao!

L'indice del sequel "Un po' di AWK" lo trovati qui.

Nessun commento:

Posta un commento