Come utilizzare Awk per filtrare testo o stringhe utilizzando azioni specifiche del modello
Nella terza parte della serie di comandi Awk, daremo un'occhiata al filtraggio del testo o delle stringhe in base a modelli specifici che un utente può definire.
A volte, quando si filtra il testo, si desidera indicare determinate righe da un file di input o righe di stringhe in base a una determinata condizione o utilizzando un modello specifico che può essere abbinato. Fare questo con Awk è molto semplice, è una delle grandi funzionalità di Awk che troverai utile.
Diamo un'occhiata all'esempio qui sotto, supponiamo che tu abbia una lista della spesa per i prodotti alimentari che desideri acquistare, chiamata food_prices.list. Ha il seguente elenco di prodotti alimentari e i relativi prezzi.
$ cat food_prices.list
No Item_Name Quantity Price
1 Mangoes 10 $2.45
2 Apples 20 $1.50
3 Bananas 5 $0.90
4 Pineapples 10 $3.46
5 Oranges 10 $0.78
6 Tomatoes 5 $0.55
7 Onions 5 $0.45
E poi, vuoi indicare un segno (*)
sugli alimenti il cui prezzo è maggiore di $2
, questo può essere fatto eseguendo il seguente comando:
awk '/ *$[2-9]\.[0-9][0-9] */ { print $1, $2, $3, $4, "*" ; } / *$[0-1]\.[0-9][0-9] */ { print ; }' food_prices.list
Dall'output sopra, puoi vedere che c'è un segno (*)
alla fine delle righe che indicano prodotti alimentari, manghi e ananas . Se controlli i loro prezzi, sono superiori a $2.
In questo esempio, abbiamo utilizzato due modelli:
- il primo:
/ *\$[2-9]\.[0-9][0-9] */
ottiene le righe il cui prezzo del prodotto alimentare è maggiore di $2 e - il secondo:
/*\$[0-1]\.[0-9][0-9] */
cerca le righe con il prezzo del prodotto alimentare inferiore a $2 .
Questo è ciò che accade, ci sono quattro campi nel file, quando il modello uno incontra una riga con il prezzo del prodotto alimentare maggiore di $2, stampa tutti e quattro i campi e un (*)
firmare alla fine della riga come flag.
Il secondo modello stampa semplicemente le altre righe con il prezzo del cibo inferiore a $2 così come appaiono nel file di input, food_prices.list.
In questo modo puoi utilizzare azioni specifiche del modello per filtrare gli articoli alimentari con un prezzo superiore a $2, anche se c'è un problema con l'output, le righe che hanno (*)
sign non sono formattati come il resto delle righe, rendendo l'output non sufficientemente chiaro.
Abbiamo riscontrato lo stesso problema nella Parte 2 della serie awk, ma possiamo risolverlo in due modi:
1. Utilizzando il comando printf che è un modo lungo e noioso utilizzando il comando seguente:
awk '/ *$[2-9]\.[0-9][0-9] */ { printf "%-10s %-10s %-10s %-10s\n", $1, $2, $3, $4 "*" ; } / *$[0-1]\.[0-9][0-9] */ { printf "%-10s %-10s %-10s %-10s\n", $1, $2, $3, $4; }' food_prices.list
2. Utilizzando il campo $0. Awk utilizza la variabile 0 per memorizzare l'intera riga di input. Questo è utile per risolvere il problema sopra ed è semplice e veloce come segue:
awk '/ *$[2-9]\.[0-9][0-9] */ { print $0 "*" ; } / *$[0-1]\.[0-9][0-9] */ { print ; }' food_prices.list
Conclusione
Per ora è tutto e questi sono semplici modi per filtrare il testo utilizzando un'azione specifica del modello che può aiutare a contrassegnare righe di testo o stringhe in un file utilizzando il comando Awk.
Spero che questo articolo ti sia utile e ricordati di leggere la parte successiva della serie che si concentrerà sull'uso degli operatori di confronto utilizzando lo strumento awk.