Ricerca nel sito web

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:

  1. il primo: / *\$[2-9]\.[0-9][0-9] */ ottiene le righe il cui prezzo del prodotto alimentare è maggiore di $2 e
  2. 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.