lunedì 15 ottobre 2012

Un po' di AWK. Settima parte

In modo molto approssimativo possiamo dire che i records coincidono con le righe di un testo. Presto spiegheremo il perchè del molto approssimativo. Mentre una cosa certa è che i records si dividono in campi. Meno certo è invece dire quali e quanti siano i campi all'interno del record. Detto così è un vero casino, me ne rendo conto. Cerchiamo di fare luce.

Di fronte ad un record del genere:

pane acqua nutella biscotti

Possiamo dire con certezza che i campi sono tanti quanto le parole. Perchè? Perchè la variabile preposta a separare un record in campi (FS) ha come valore predefinito lo spazio.

Infatti, se lanciamo questa riga di comando

$ echo "pane acqua nutella biscotti" | awk '{print NF}'

ci darà come risultato 4 campi. Notate che NF è una variabile che ci dice il numero di campi in cui è diviso il record corrente.

Se però ci troviamo di fronte a un record del genere:

pane;acqua;nutella;biscotti

Di sicuro NF non ci dirà più che il record è diviso in quattro campi.

Infatti se proviamo a lanciare questa riga di comando,

echo "pane;acqua;nutella;biscotti" | awk '{print NF}'

NF darà come risultato 1, cioè il nostro record avrà un solo campo!

Affinchè questo record abbia quattro campi, è necessario settare la variabile FS (che sta per separatore di campi), cioè in questo caso il separatore di campi non sarà più lo spazio, bensì il punto e virgola.

avremo allora

$ echo "pane;acqua;nutella;biscotti" | awk -F ';' '{print NF}'


Lo stesso discorso vale per i records! In "condizioni normali" il record coinciderà con una riga del nostro testo, ma non è sempre così.

Supponiamo di avere la seguente riga: 

mela pera;cane gatto; Milano bari

Ora il separatore di record predefinito utilizzato da awk è la nuova linea; ma se vogliamo sostituire la nuova linea con il punto e virgola, allora la nostra riga non coinciderà più con il record.

Infatti se diamo questa riga di comando

$ echo "mela pera; cane gatto; Milano bari" | awk 'BEGIN { RS=";" } {print NR}'

Avremo come risultato 3 records, cioè l'unica riga contiene tre records! Da notare che RS sta per separatore di record, mentre NR sta per numero di record.

Ritorneremo su tutte queste variabili. A me premeva dire in questo post che sia il concetto di record che di campo sono concetti molto relativi.

PS1. L'indice del sequel "un po' di AWK" lo trovate qui
PS2. Qualora ne abbiate voglia, tempo e pazienza, ho dato vita ad un nuovo blog. Qui
PS3. Vi ricordo che è appena iniziato su questo blog un minicorso su python. Il primo post lo trovate qui. Presto creerò la pagina dell'indice.

Alla prossima!

Nessun commento:

Posta un commento