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:

  1. primul: / *\$[2-9]\.[0-9][0-9] */ primește liniile care au prețul produselor alimentare mai mare de 2 USD și
  2. 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.