Cum să utilizați Awk pentru a filtra textul sau șirurile de caractere folosind acțiuni specifice modelului
În a treia parte a seriei de comenzi Awk, vom arunca o privire la filtrarea textului sau a șirurilor de caractere pe baza unor modele specifice pe care un utilizator le poate defini.
Uneori, când filtrați text, doriți să indicați anumite linii dintr-un fișier de intrare sau linii de șiruri de caractere pe baza unei anumite condiții sau folosind un model specific care poate fi potrivit. A face acest lucru cu Awk este foarte ușor, este una dintre caracteristicile grozave ale Awk pe care o veți găsi de ajutor.
Să aruncăm o privire la un exemplu de mai jos, să presupunem că aveți o listă de cumpărături pentru produsele alimentare pe care doriți să le cumpărați, numită food_prices.list. Are următoarea listă de produse alimentare și prețurile acestora.
$ 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
Și apoi, doriți să indicați un semn (*)
pe produsele alimentare al căror preț este mai mare de $2
, acest lucru se poate face executând următoarea comandă:
$ awk '/ *$[2-9]\.[0-9][0-9] */ { print $1, $2, $3, $4, "*" ; } / *$[0-1]\.[0-9][0-9] */ { print ; }' food_prices.list
Din rezultatul de mai sus, puteți vedea că există un semn (*)
la sfârșitul rândurilor cu produse alimentare, mango și ananas >. Dacă le verificați prețurile, acestea sunt peste 2 USD.
În acest exemplu, am folosit două modele:
- primul:
/ *\$[2-9]\.[0-9][0-9] */
primește liniile care au prețul produselor alimentare mai mare de 2 USD și - al doilea:
/*\$[0-1]\.[0-9][0-9] */
caută linii cu prețul produselor alimentare mai mic de 2 USD<.
Acesta este ceea ce se întâmplă, există patru câmpuri în fișier, când modelul unu întâlnește o linie cu prețul produsului alimentar mai mare de 2 USD, se tipăresc toate cele patru câmpuri și un (*) semn la sfârșitul liniei ca steag.
Al doilea model imprimă pur și simplu celelalte rânduri cu prețul alimentelor mai mic de 2 USD, așa cum apar în fișierul de intrare, food_prices.list.
În acest fel, puteți utiliza acțiuni specifice modelului pentru a filtra produsele alimentare cu prețuri peste 2 USD, deși există o problemă cu rezultatul, liniile care au (*)
semnele nu sunt formatate ca și restul liniilor, ceea ce face ca rezultatul să nu fie suficient de clar.
Am văzut aceeași problemă în partea 2 a seriei awk, dar o putem rezolva în două moduri:
1. Folosind comanda printf, care este un mod lung și plictisitor folosind comanda de mai jos:
$ 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. Folosind câmpul $0. Awk folosește variabila 0 pentru a stoca întreaga linie de intrare. Acest lucru este util pentru rezolvarea problemei de mai sus și este simplu și rapid după cum urmează:
$ awk '/ *$[2-9]\.[0-9][0-9] */ { print $0 "*" ; } / *$[0-1]\.[0-9][0-9] */ { print ; }' food_prices.list
Concluzie
Asta e tot deocamdată și acestea sunt modalități simple de filtrare a textului folosind acțiuni specifice modelului care pot ajuta la semnalarea liniilor de text sau a șirurilor dintr-un fișier folosind comanda Awk.
Sper că veți găsi acest articol util și nu uitați să citiți următoarea parte a seriei, care se va concentra pe utilizarea operatorilor de comparație folosind instrumentul awk.