venerdì 2 marzo 2012

Un po' di AWK. Prima parte

Salve!

Ho potuto constatare, girando tra i vari blog, anche stranieri, che, quando l'argomento del post è estremamente semplice, si suole usare la seguente dicitura:

"Attenzione, post per neofiti!"

Bene! Ora cerchiamo di fare qualche operazione con AWK.

Ometto del tutto la teoria (forse non è necessaria) e mi limito a fare qualche operazione semplice semplice.

Partiamo da un file che contenga il seguente testo:

Atalanta   Genoa           1 1
Cagliari    Roma            2 2
Catania    Fiorentina      0 2
Chievo       Inter            2 2
Lazio         Udinese        1 3
Lecce        Napoli           1 1
Milan         Juventus      1 1
Sampdoria Reggina        5 0
Siena         Palermo        1 0
Torino        Bologna       1 1


Salviamolo nella directory Documenti e nominiamolo file.txt

Le operazioni che andremo a compiere avranno come oggetto proprio il testo di cui sopra.

A questo punto iniziamo a porci qualche meta:

1. Stampare un elenco delle sole squadre in trasferta.
2. Stampare un elenco delle sole squadre che giocano in casa.
3. Stampare un elenco di tutte le partite il cui risultato è stato 1 a 1
4. Stampare un elenco delle partite il cui risultato è stato un 2 a 2
5. Stampare un elenco delle partite con vittoria fuori casa
6. Stampare un elenco delle partite con vittoria in casa
7. Stampare un elenco  delle squadre che giocano in casa il cui nome inizia con la lettera c.
8. Stampare un elenco di tutte le squadre il cui nome conta più di 6 caratteri.

E fermiamoci qui.

Finora abbiamo solo un file di testo,"file.txt"

Ora creeremo una serie di script semplici che cercheranno di dare una risposta ai nostri quesiti.

Sempre nella cartella Documenti creiamo un altro file di testo e costruiamo il primo script.

Sul file creato incolliamo il seguente testo:

#!/usr/bin/awk -f
{print $2}


nominiamolo "test1"

Ora apriamo un terminale e spostiamoci nella directory Documenti

cd Documenti

Rendiamo eseguibile il nostro script

chmod +x test1

e, restando in Documenti, lanciamolo così

./test file.txt

Eccone il risultato:

[bit3lux@bit Documenti]$ ./test1 file.txt
Genoa
Roma
Fiorentina
Inter
Udinese
Napoli
Juventus
Reggina
Palermo
Bologna

Passiamo al secondo quesito: Elenco delle sole squadre che giocano in casa

Creiamo il secondo script (che nomineremo test2)

#!/usr/bin/awk -f
{print $1}


Rendiamo eseguibile e lanciamolo.

Il risultato sarà il seguente:

[bit3lux@bit Documenti]$ ./test2 file.txt
Atalanta
Cagliari
Catania
Chievo
Lazio
Lecce
Milan
Sampdoria
Siena
Torino

Passiamo al terzo quesito: Elenco di tutte le partite il cui risultato è stato 1 a 1.

Come al solito creamo uno script (test3) con il seguente testo:

#!/usr/bin/awk -f
($3==1 && $4==1) {print $0}


Rendiamolo eseguibile e lanciamolo come al solito.

Risultato:

[bit3lux@bit Documenti]$ ./test3 file.txt
Atalanta Genoa             1 1
Lecce     Napoli             1 1
Milan     Juventus          1 1
Torino     Bologna         1 1

Passiamo al quarto quesito: Elenco delle partite il cui risultato è stato un 2 a 2

Creiamo un altro script, sempre nella cartella documenti, che nomineremo test4

#!/usr/bin/awk -f
($3==2 && $4==2) {print $0}


Risultato:

[bit3lux@bit Documenti]$ ./test4 file.txt
Cagliari Roma             2 2
Chievo     Inter             2 2

Passiamo al quinto quesito: Elenco delle partite con vittoria fuori casa.

#!/usr/bin/awk -f
($3<$4) {print $0}


Risultato:

[bit3lux@bit Documenti]$ ./test5 file.txt
Catania Fiorentina     0 2
Lazio     Udinese     1 3

Sesto quesito: Elenco delle partite con vittoria in casa.

#!/usr/bin/awk -f
($3>$4) {print $0}


Solito discorso: creare script, renderlo eseguibile e lanciarlo (non lo dirò più!)

Risultato:

 [bit3lux@bit Documenti]$ ./test6 file.txt
Sampdoria Reggina     5 0
Siena     Palermo     1 0

Settimo quesito: elenco  delle squadre che giocano in casa il cui nome inizia con la C.

#!/usr/bin/awk -f
($1~/^C/) { print $1 }


Risultato:

[bit3lux@bit Documenti]$ ./test7 file.txt
Cagliari
Catania
Chievo

Passiamo all'ultimo quesito: Elenco delle squadre fuori casa il cui nome conta più di 6 caratteri.

#!/usr/bin/awk -f
(length($2)>6) {print $2}


Risultato:

[bit3lux@bit Documenti]$ ./test8 file.txt
Fiorentina
Udinese
Juventus
Reggina
Palermo
Bologna

Per oggi è tutto, ma su awk ci ritornerò volentieri.

Dimenticavo, solo una piccola precisazione, anche se si è intuita:
$1, $2, $3 e $4, nell'esempio fatto, stanno ad indicare le colonne (squadre in casa, squadre fuori casa, i gol delle squadre in casa, i gol delle  squadre fuori casa); $0, invece, indica l'insieme delle righe; infatti, se lancio il seguente script

#!/usr/bin/awk -f
{print $0} 

mi stamperà tutto il documento.

Ciao :)

2 commenti:

  1. OK! un buon inizio ma:
    1) si potrebbe approfondire;
    2) AWK non è mai per neofiti, imho.
    O è solo una maldicenza quella del punto 2. Io pr esempio lo amo da decenni, come se fossimo sposati.
    Dai Bit3Lux l'argomento merita approfondimenti.

    RispondiElimina
    Risposte
    1. Hai perfettamente ragione...ma ancora siamo troppo in superficie...AWk è molto ma molto di più... :)) Facilissimo non è ma, nell'elaborazione dei testi, è insuperabile.

      Elimina