Kako koristiti Awk za filtriranje teksta ili nizova pomoću radnji specifičnih za uzorak


U trećem dijelu serije naredbi Awk, pogledat ćemo filtriranje teksta ili nizova na temelju specifičnih uzoraka koje korisnik može definirati.

Ponekad, kada filtrirate tekst, želite naznačiti određene retke iz ulazne datoteke ili retke nizova na temelju danog uvjeta ili koristeći određeni uzorak koji se može podudarati. Učiniti ovo s Awk vrlo je jednostavno, to je jedna od sjajnih značajki Awk koja će vam biti od pomoći.

Pogledajmo primjer u nastavku, recimo da imate popis za kupovinu namirnica koje želite kupiti, a zove se food_prices.list. Ima sljedeći popis prehrambenih artikala i njihove cijene.

$ 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

Zatim, želite označiti (*) znak na prehrambenim artiklima čija je cijena veća od $2, to možete učiniti pokretanjem sljedeće naredbe:

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

Iz gornjeg rezultata možete vidjeti da postoji znak (*) na kraju redaka koji sadrže prehrambene artikle, mango i ananas . Ako provjerite njihove cijene, one su iznad $2.

U ovom primjeru upotrijebili smo dva uzorka:

  1. prvi: / *\$[2-9]\.[0-9][0-9] */ dobiva retke koji imaju cijenu prehrambenih proizvoda veću od $2 i
  2. drugi: /*\$[0-1]\.[0-9][0-9] */ traži retke s cijenom prehrambenog artikla nižom od $2 .

Ovo se događa, postoje četiri polja u datoteci, kada uzorak jedan naiđe na redak s cijenom prehrambenog artikla većom od $2, ispisuje sva četiri polja i (*) znak na kraju retka kao zastavica.

Drugi uzorak jednostavno ispisuje ostale retke s cijenom hrane manjom od $2 kako se pojavljuju u ulaznoj datoteci, food_prices.list.

Na ovaj način možete koristiti radnje specifične za uzorak kako biste filtrirali prehrambene artikle čija je cijena veća od $2, iako postoji problem s izlazom, redcima koji imaju (*) znakovi nisu formatirani kao ostali redovi, zbog čega izlaz nije dovoljno jasan.

Vidjeli smo isti problem u 2. dijelu serije awk, ali ga možemo riješiti na dva načina:

1. Korištenje naredbe printf što je dug i dosadan način korištenja naredbe ispod:

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. Korištenje polja $0. Awk koristi varijablu 0 za pohranjivanje cijele linije unosa. Ovo je zgodno za rješavanje gornjeg problema i jednostavno je i brzo na sljedeći način:

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

Zaključak

To je to za sada, a ovo su jednostavni načini filtriranja teksta pomoću akcije specifične za uzorak koja može pomoći u označavanju redaka teksta ili nizova u datoteci pomoću naredbe Awk.

Nadamo se da će vam ovaj članak biti od pomoći i ne zaboravite pročitati sljedeći dio serije koji će se fokusirati na korištenje operatora usporedbe pomoću awk alata.