Skip to main content

Come scrivere comandi e script AWK

Corso sugli script bash parte 01 - introduzione (Giugno 2025)

Corso sugli script bash parte 01 - introduzione (Giugno 2025)
Anonim

Il comando awk è un potente metodo per elaborare o analizzare file di testo, in particolare file di dati organizzati per righe (righe) e colonne.

Semplice awk i comandi possono essere eseguiti dalla riga di comando. Le attività più complesse dovrebbero essere scritte come programmi awk (i cosiddetti script awk) in un file.

Il formato di base di un comando awk è simile al seguente:

awk 'pattern {action}' input-file> file di output

Ciò significa: prendere ogni riga del file di input; se la linea contiene il modello, applica l'azione alla linea e scrivi la riga risultante nel file di output. Se il modello è omesso, l'azione viene applicata a tutte le linee. Per esempio:

awk '{print $ 5}' table1.txt> output1.txt

Questa istruzione prende l'elemento della quinta colonna di ogni riga e la scrive come una riga nel file di output "output.txt". La variabile '$ 4' si riferisce alla seconda colonna. Allo stesso modo è possibile accedere alla prima, seconda e terza colonna, con $ 1, $ 2, $ 3, ecc. Si presuppone che le colonne siano separate da spazi o tab (cosiddetti spazi bianchi). Quindi, se il file di input "table1.txt" contiene queste righe:

1, Justin Timberlake, titolo 545, prezzo $ 7,302, Taylor Swift, Titolo 723, Prezzo $ 7,903, Mick Jagger, titolo 610, prezzo $ 7,904, Lady Gaga, titolo 118, prezzo $ 7,305, Johnny Cash, Titolo 482, Prezzo $ 6,506, Elvis Presley, titolo 335, prezzo $ 7,307, John Lennon, titolo 271, prezzo $ 7,908, Michael Jackson, titolo 373, prezzo $ 5,50

Quindi il comando scriverà le seguenti righe nel file di output "output1.txt":

545,723,610,118,482,335,271,373,

Se il separatore di colonna è qualcosa di diverso da spazi o tabulazioni, come una virgola, puoi specificarlo nell'istruzione awk come segue:

awk -F, '{print $ 3}' table1.txt> output1.txt

Questo selezionerà l'elemento dalla colonna 3 di ogni riga se le colonne sono considerate separate da una virgola. Pertanto l'output, in questo caso, sarebbe:

Titolo 545 Titolo 723 Titolo 610 Titolo 118 Titolo 482 Titolo 335 Titolo 271 Titolo 373

L'elenco di istruzioni all'interno delle parentesi graffe ('{', '}') è chiamato blocco. Se si mette un'espressione condizionale davanti a un blocco, l'istruzione all'interno del blocco verrà eseguita solo se la condizione è vera.

awk '$ 7 == " $ 7.30" {print $ 3}' table1.txt

In questo caso, la condizione è $ 7 == " $ 7.30", il che significa che l'elemento nella colonna 7 è uguale a $ 7,30. Il backslash davanti al simbolo del dollaro viene utilizzato per impedire al sistema di interpretare $ 7 come variabile e prendere invece letteralmente il simbolo del dollaro.

Quindi questa istruzione awk stampa l'elemento nella terza colonna di ogni riga che ha un "$ 7,30" nella colonna 7.

Puoi anche utilizzare espressioni regolari come condizione. Per esempio:

awk '/ 30 / {print $ 3}' table1.txt

La stringa tra le due barre ('/') è l'espressione regolare. In questo caso, è solo la stringa "30". Ciò significa che se una riga contiene la stringa "30", il sistema stampa l'elemento nella terza colonna di quella linea. L'output nell'esempio precedente potrebbe essere:

Timberlake, Gaga, Presley,

Se gli elementi della tabella sono numeri awk può eseguire calcoli su di essi come in questo esempio:

awk '{print ($ 2 * $ 3) + $ 7}'

Oltre alle variabili che accedono agli elementi della riga corrente ($ 1, $ 2, ecc.) C'è la variabile $ 0 che si riferisce alla riga completa (riga) e alla variabile NF che contiene il numero di campi.

Puoi anche definire nuove variabili come in questo esempio:

awk '{sum = 0; per (col = 1; col <= NF; col ++) sum + = $ col; stampare la somma; }'

Questo calcola e stampa la somma di tutti gli elementi di ogni riga.

Le istruzioni Awk sono spesso combinate con comandi sed.