Com utilitzar Awk per filtrar text o cadenes mitjançant accions específiques del patró


A la tercera part de la sèrie d'ordres Awk, analitzarem el filtratge de text o cadenes en funció de patrons específics que un usuari pot definir.

De vegades, quan filtreu text, voleu indicar determinades línies d'un fitxer d'entrada o línies de cadenes en funció d'una condició determinada o utilitzant un patró específic que es pugui coincidir. Fer-ho amb Awk és molt fàcil, és una de les grans característiques d'Awk que us resultarà útil.

Fem un cop d'ull a un exemple a continuació, diguem que teniu una llista de la compra per als aliments que voleu comprar, anomenada food_prices.list. Té la següent llista d'aliments i els seus preus.

$ 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

A continuació, voleu indicar un signe (*) als aliments el preu dels quals és superior a $2, això es pot fer executant l'ordre següent:

$ awk '/ *$[2-9]\.[0-9][0-9] */ { print $1, $2, $3, $4, "*" ; } / *$[0-1]\.[0-9][0-9] */ { print ; }' food_prices.list

A la sortida anterior, podeu veure que hi ha un signe (*) al final de les línies amb aliments, mangos i pinyes. Si comproveu els seus preus, superen els 2 dòlars.

En aquest exemple, hem utilitzat dos patrons:

  1. el primer: / *\$[2-9]\.[0-9][0-9] */ obté les línies que tenen un preu d'aliment superior a 2 $i li>
  2. la segona: /*\$[0-1]\.[0-9][0-9] */ cerca línies amb un preu d'aliment inferior a 2 $.
  3. >

Això és el que passa, hi ha quatre camps al fitxer, quan el patró 1 troba una línia amb un preu d'aliment superior a 2 $, imprimeix els quatre camps i un signe (*) al final de la línia com una bandera.

El segon patró simplement imprimeix les altres línies amb un preu dels aliments inferior a 2 dòlars tal com apareixen al fitxer d'entrada, food_prices.list.

D'aquesta manera, podeu utilitzar accions específiques de patró per filtrar els aliments amb un preu superior a 2 dòlars, tot i que hi ha un problema amb la sortida, les línies que tenen el signe (*) no estan formatades com el resta de línies fent que la sortida no sigui prou clara.

Hem vist el mateix problema a la part 2 de la sèrie awk, però el podem resoldre de dues maneres:

1. Utilitzeu l'ordre printf que és una manera llarga i avorrida mitjançant l'ordre següent:

$ 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. Utilitzant el camp $0. Awk utilitza la variable 0 per emmagatzemar tota la línia d'entrada. Això és útil per resoldre el problema anterior i és senzill i ràpid de la següent manera:

$ awk '/ *$[2-9]\.[0-9][0-9] */ { print $0 "*" ; } / *$[0-1]\.[0-9][0-9] */ { print ; }' food_prices.list 

Conclusió

Això és tot de moment i aquestes són maneres senzilles de filtrar text mitjançant accions específiques de patró que poden ajudar a marcar línies de text o cadenes en un fitxer mitjançant l'ordre Awk.

Espero que aquest article us sigui útil i recordeu llegir la següent part de la sèrie que se centrarà en l'ús d'operadors de comparació amb l'eina awk.