martedì 6 marzo 2012

Un po' di AWK. Terza parte.

Salve!

Ed eccoci a quello che ormai, volendo o nolendo, è diventato un sequel: Un nuovo post su AWK. :)

Mi occupo di questo linguaggio, che ho scoperto da non molto tempo, perchè mi è molto utile nel lavoro. Mi capita, infatti, di avere a che fare spesso con tabelle di non semplice comprensione.

Come al solito, condivido con voi i miei esperimenti ( altrimenti detti "elucubrazioni notturne").

Nell'ultimo post (qui), se ricordate, ero partito da una tabella contenente l'elenco di nove candidati con i rispettivi voti di cinque prove. Poi avevo creato uno script che calcolasse, per ciascun alunno, la media col relativo giudizio: promosso/bocciato.

Stasera partirò proprio dell'output di quello script per elaborarlo ulteriormente in modo da trarne dei dati statistici.

L'output del precedente script è il seguente:


Alunno1 22.2 => promosso
Alunno2 17.6 => respinto
Alunno3 25.6 => promosso
Alunno4 24.2 => promosso
Alunno5 29.4 => promosso
Alunno6 17.6 => respinto
Alunno7 29.8 => promosso
Alunno8 25.6 => promosso
Alunno9 24.2 => promosso


Bene! La meta che mi prefiggo stasera è quella di ricavare:
  • il numero degli studenti promossi e di quelli respinti col rispettivo valore percentuale
  • la media totale di tutti gli studenti ( si dice così?).

La tabella da elaborare l'ho salvata nella cartella Documenti e l'ho nominata tabella.txt

Poi ho creato lo script!


#!/usr/bin/awk -f
 

BEGIN {
             count1=0
             count2=0
             print "\fRISULTATI STATISTICI"         
}
 #conto i candidati promossi
 $4 ~ /promosso/ {count1++}
 #conto i candidati respinti
 $4 ~ /respinto/ {count2++}
 #calcolo la percentuale dei promossi
 {promossi=(count1/NR)*100}
 #calcolo la percentuale dei respinti
 {respinti=(count2/NR)*100}
 #calcolo il punteggio medio tra tutti i candidati
 {media+=$2/9}
 
END {
           print "\fnumero candidati:", NR
           print "numero dei promossi:", count1
           print "percentuale dei promossi", promossi "%"
           print "numero dei respinti", count2
           print "percentuale dei respinti:", respinti "%"
           print "punteggio medio di tutti i candidati:", media
           print ".........................."
}


Mi ha restituito il seguente output:



Dopo aver salvato la tabella nella cartella Documenti, la stessa cosa ho fatto per lo script che ho nominato "statistica.awk"

Aperto un terminale, spostiamoci nella cartella Documenti:

$ cd Documenti

Assegnamo allo script i permessi di esecuzione

$ chmod +x statistica.awk

ed eseguiamolo

$ ./statistica.awk tabella.txt

Mi rendo conto che è arrivato il momento di spendere qualche parolina in più su questo linguaggio ( ora perdo la faccia!)

Ci provo, non è molto semplice parlare di AWK!

AWK è un linguaggio di programmazione che permette l'elaborazione di dati strutturati e stampa dei report formattati. Cavolo! :)

In altri termini, AWK va a nozze con le tabelle (dati strutturati) e non solo con le tabelle. E riesce ad elaborare il testo secondo gli ordini impartiti (report formattati)

AWK, una volta messo in moto, legge il file di input una riga per volta.

 Ogni riga del testo  è detta record ed è divisa, a sua volta, in campi. Il discorso sui campi si potrebbe fare difficilissimo, ma mi limito a dire, per ora, solo una cosa: Di default AWK prende come separatore, per distinguere un campo dall'altro, lo spazio. E' inutile dirvi che esistono altri tipi di separatori (di campo). Forse ne parleremo in seguito.

In definitiva, cosa sono i record e cosa sono i campi?

Prendo la prima riga della tabella di cui sopra:

"Alunno1 22.2 => promosso"

Il record è tutta la riga, i campi invece sono: Alunno1, 22.2, => e la parola promosso; come potete notare, sono divisi gli uni dagli altri da uno spazio.

Questo record (riga), dunque, ha 4 campi! Come sono chiamati i campi? Dal loro numero preceduto dal simbolo del dollaro. Il primo campo è la parola Alunno1 e viene chiamato $1; il secondo campo è il numero 22.2 e viene chiamato $2 e via dicendo. L'intera riga, invece, viene chiamata $0. Già con queste poche nozioni (cavolate :D) si capisce qualcosa in più dei post precedenti. qui qui.

Dopo questa breve introduzione su AWK, passiamo allo script di oggi.

Partiamo dalla prima riga:

#!/usr/bin/awk -f

Questa riga, come per il linguaggio bash, contiene l'indicazione dell'interprete. Una cosa che risalta subito è quel  -f. Si tratta di un'opzione che indica all'interprete che il programma è contenuto in un file. :)) Tutto qui. (me lo auguro).

Subito dopo la prima riga ci troviamo di fronte a tre sezioni di codice. Una prima parte, BEGIN; la parte centrale e la parte finale, END appunto.

Tutte le operazioni che si trovano nella sezione BEGIN (che significa inizio) sono eseguite prima dell'elaborazione del testo.

Nella parte centrale troviamo tutte quelle operazioni che devono essere eseguite ad ogni lettura di riga.

Nella Sezione END troviamo quelle operazioni che saranno eseguite dopo l'elaborazione del testo.

Madonna che fatica. :))

Ciao!

2 commenti:

  1. Già alla terza parte ed io ancora non ho letto la seconda.. che FAIL che sono. :D

    RispondiElimina
    Risposte
    1. Ma no, che dici... :)) Tu puoi leggere la seconda parte quando più ti aggrada, anche domenica prossima :D

      Elimina