Awk – Programmazione

postato in: Guida, Terminale | 0

awk_big-1024x3942

Buongiorno! Nella puntata precedente abbiamo imparato ad utilizzare il comando Awk e abbiamo cercato di svelare qualche utilizzo per verificarne la sua utilità.

Per chi non lo ha ancora fatto, la lettura della puntata precedente è propedeutica per capire questa guida.

 

Awk è un programma che si trova nativamente all'interno dei sistemi Linux, ma che risulta essere disponibile anche nei sistemi Windows e Apple.

Come detto nell'introduzione, Awk è si un programma richiamabile tramite linea di comando Linux, ma non solo, anzi è principalmente un interprete del linguaggio Awk. Questo vuol dire che è possibile scrivere dei programmi ed eseguirli, il che rende ancora più potente l'utilizzo del comando.

 

 

PREMESSA
Per prima cosa scarichiamo il file che useremo durante tutta questa guida al seguente link.
In questa puntata ci concentreremo sulla scrittura di piccoli programmi per Awk, che andremo a scrivere nel file tutorial.awk. Creiamo il file con:

touch tutorial.awk

lo apriamo con qualunque editor di testo e inseriamo come prima riga:

#!/bin/awk

 

 

SPECIFICARE IL SEPARATORE DEL FILE
Nella puntata precedente abbiamo visto come fare delle semplici ricerche all'interno di file. I file possono essere formattati in vari modi, e non sempre sono nella formattazione standard Linux, il cui separatore è la colonna (la maggior parte dei comandi hanno un output suddiviso in questo modo).
Il separatore di default è lo spazio, e per specificarne uno diverso basta dare:

awk -F <separatore> <resto del comando>

se, ad esempio, stiamo lavorando con un CSV – Comma Separated Values – daremo:

awk -F , <resto del comando>

 

 

RICERCA AVANZATA
A partire dall'informazione data dalla presenza del separatore, Awk separa le varie linee in campi. Se il file è regolare avremo un output suddiviso a colonne di campi. Ogni colonna è identificata da un indice. Banalmente la prima colonna avrà indice 1, la seconda indice 2 e così via.
Capita molto spesso che dobbiamo ricercare informazioni in determinate colonne. Per indicare quindi la ricerca all'interno di una certa colonna dovremo specificarne l'indice preceduto dal simbolo $.

Ad esempio se vogliamo ricercare tutte le monete che pesano esattamente 1 oncia, abbiamo bisogno di specificare la colonna in cui effettuare la ricerca, altrimenti Awk stamperà a video tutte le linee che contengono 1. Scriviamo sul file tutorial.awk il pattern:

$2 ~ /1/ {
  if ($2 == 1) {
     print $1
  }
}

ossia ricerchiamo all'interno della colonna numero 2 tutti i campi contenenti uno, e tra questi verifichiamo che siano esattamente uguali a uno.

colonna

I costrutto ~ permette di effettuare la ricerca per colonna. Per impostare di NON effettuare la ricerca si utilizza il ~! .

Abbiamo utilizzato il costrutto if per specificare di stampare la linea solo se la colonna contiene esattamente 1. Altri costrutti utili sono:

  • while
  • for
  • if – else

Per ulteriori informazioni su come funzionino gli altri costrutti vi consigliamo la lettura di questa pagina.

 

 

ESPRESSIONI REGOLARI
Spesso non si sa con precisione cosa cercare. In nostro aiuto arrivano le espressioni regolari. Queste sono un modo di rappresentare la conoscenza. Ad esempio, se vogliamo cercare tutte le stringhe che corrispondono ai numeri (ossia da 0 a 9). Utilizzando questa notazione: [0-9], indicheremo ad Awk di ricercare tutti i numeri nel range da 0 a 9.
Le espressioni regolari più comuni sono:

  • /[0-9]/ → Cerca tutti i numeri da 0 a 9.
  • /[a-zA-Z]/ → Cerca tutte le lettere, sia maiuscole che minuscole.
  • /[^a-z]/ → il carattere ^ rappresenta il NOT logico. In questo caso significa che Awk deve cercare solo linee NON contenenti lettere minuscole.
  • /(^Germany)|(^Netherlands)/ → Il simbolo | rappresenta il connettivo logico OR.
  • /wh./ → Il . rappresenta la cosiddetta wildcard. Nota come * nei sistemi Linux, indica ad Awk di ricercare tutte le linee che iniziano per wh.
  • /a*/ → Cerca tutte le linee che contengono a, aa, aaa, aaaa, aaaaa
  • /a?/ → Cerca le linee che corrispondono zero o una volta a nelle linee.
  • /a+/ → Come sopra, ma una o più volte.

 

 

VARIABILI E SUPERVARIABILI
Le variabili sono utili per memorizzare informazioni. Per dichiarare una variabile, basta inserirla all'interno di un blocco. Ovviamente dao che i blocchi di codice vengono attivati in modo imprevedibile, e in maniera differente, osserviamo che spesso è conveniente inserire la dichiarazione all'interno del blocco BEGIN. Ad esempio:

BEGIN {
  variabile_1 = 1;
}

In questo caso abbiamo memorizzato 1 all'interno della variabile variabile_1.
Esempio: vogliamo contare il numero di monete d'oro. Per farlo scriveremo:

BEGIN {
  contatore = 0;
}

/gold/ {
  contatore = contatore + 1;
  print $0;
}

END {
  print "Ci sono " contatore " monete d'oro.";
}

In questo codice abbiamo utilizzato sia il BEGIN, che viene attivato per primo, e il blocco END che è attivato come ultimo.

contatore

Awk ci viene in aiuto e mette a disposizioni delle supervariabili, ossia variabili già dichiarate e gestite interamente da Awk:

  • NR → Conta il numero di linee lette.
  • NF → Mantiene il conto del numero di parole lette in una riga. $NF è un facile modo per accedere all'ultimo campo.
  • FILENAME → Contiene il nome del file in cui si effettua la ricerca.
  • FS → Field separator. Normalmente lo spazio.
  • RS → Record separator. L'acapo. \n nei sistemi Linux.
  • OFS → Output Field Separator.
  • ORS → Output Record Separator.

 

 

CONCLUSIONI
Awk è potentissimo, e le sue applicazioni sono numerosissime. Fateci sapere come va, e come lo utilizzate voi! A presto!

 

Link alle altre puntate:

 

FONTI

Dottore in Informatica. Appassionato di computer fin dal primo PC Olivetti con Windows 95 e la bellezza di 8 MB di RAM.
Utilizzatore Linux da 5 anni, credo profondamente nella filosofia open source.
Dopo tante distro provate sul mio fidato Toshiba, uso Fedora per lo studio e il divertimento.

Lascia un commento