In questi giorni mi è capitato di ricorrere al piccolo ma potentissimo comando awk. Le sue potenzialità superano i limiti dell’immaginazione, lo si può usare per tantissimi scopi, ma spesso ci si dimentica di lui e si ricorre ad altri strumenti più macchinosi. Vi mostro ora due esempi di utilizzo di questo comando che ho utilizzato per un lavoretto sulla mia tesi, e che mi hanno fatto risparmiare un bel po’ di tempo
Usare awk per splittare stringhe
awk può essere facilmente utilizzato per eseguire lo split di stringhe ricorrendo anche all’uso di espressioni regolari.
$ awk -F ";" '{print $1"\t"$2"\t"$3"\t"$4"\t"$5}' elenco.txt
ove -F “;” indica quale carattere (o l’espressione regolare) delimita le stringhe da separare, print $i stampa le stringhe così ottenute separandole da una tabulazione (indicata da \t). Quindi se in input abbiamo il file di testo (elenco.txt) fatto così:
Metallica;Queen;Muse;Zucchero;Pink Floyd
il comando produrra un output così (qui non si nota molto la tabulazione perché WordPress si mangia gli spazi):
Metallica Queen Muse Zucchero Pink Floyd
al posto di “;” potete inserire qualsiasi espressione regolare inserendola all’interno di / e /. Trovare esempi di espressioni regolari già pronte qui, mentre qua le potete testare. Questo metodo può rilevarsi utile quando di manipolano file CSV i quali generalmente usano il ; (o la ,) come carattere separatore dei campi.
Usare awk per lanciare ripetutamente un programma
Problema:
Devo usare un piccolo programma (in Java) per fare delle conversioni sulle date e stamparle, ed in input ho un elenco di timestamp.
Soluzione rapida:
Uso awk per passare a Java ogni singolo oggetto stringa (il timestamp), invocando di volta in volta il programma Java. Non è la soluzione più bella ne tantomeno efficace perché la JVM ogni volta alloca tutto il codice della classe (ma di questo ne riparleremo in un prossimo post), ma richiede pochissimo tempo nel realizzarla.
Supponiamo di avere il programma Java si chiama DataConverter.java e riceve in ingresso un parametro (il numero): se fosse invocato manualmente ogni volta il comando sarebbe questo (il timestamp è in millisecondi):
$ java DataConverter 1234567890123
che genererà una data in un formato human readable (es: 06/06/1983) da stampare sulla console, ma noi vogliamo automatizzare la procedura avendo a disposizione un file di testo contente n timestamp. Usiamo ancora una volta il magico awk:
$ awk '{print "java DataConverter "$1}' date.txt | sh > dateOutput.txt
Analizziamolo.
Questo intero comando può essere pensato come un’esecuzione concatenata di 3 funzioni (processi) più piccole.
awk ‘{print “java DataConverter “$1}’ date.txt
awk prende in ingresso il file .txt che è un elenco di un numero su ogni riga; esso genera la stringa java DataConverter $1 ove $1 viene di volta in volta sostituito con il numero appena letto.
significa che la stringa appena generata deve essere interpretata (attraverso l’IPC della pipe | ) dalla shell come un comando da eseguire. Infatti la stringa java DataConverter $1 non è altro che l’invocazione del programmino Java di prima.
serve per redirige l’output sul file di testo indicato anziché stampare il risultato sulla console. Come vedete con la console potete combinare assieme ben tre linguaggi di programmazione differenti (java, awk, script bash) con l’ausilio di pochissimi comandi
Utili risorse per conoscere AWK:
Commenti recenti