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