Kako uporabiti Awk za filtriranje besedila ali nizov s posebnimi dejanji vzorca


V tretjem delu serije ukazov Awk si bomo ogledali filtriranje besedila ali nizov na podlagi določenih vzorcev, ki jih lahko določi uporabnik.

Včasih med filtriranjem besedila želite navesti določene vrstice vhodne datoteke ali vrstice nizov, ki temeljijo na določenem stanju ali z uporabo določenega vzorca, ki se mu lahko ujema. To storiti z Awk je zelo enostavno, saj je to ena izmed odličnih lastnosti Awka, ki se vam bo zdela koristna.

Oglejmo si spodnji primer, recimo, da imate nakupovalni seznam za prehrambene izdelke, ki jih želite kupiti, imenovan food_prices.list. Ima naslednji seznam živilskih izdelkov in njihove cene.

$ 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

Nato želite na živilih, katerih cena je višja od 2 $, označiti znak (*) , kar lahko storite z naslednjim ukazom:

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

Iz zgornjega izhoda lahko vidite, da je na koncu vrstic znak (*) , ki vsebuje prehrambene izdelke, mango in ananas. Če preverite njihove cene, so nad 2 USD.

V tem primeru smo uporabili dva vzorca:

  1. prvi: /*\$[2-9] \. [0-9] [0-9] */ dobi vrstice s ceno prehrambenih izdelkov nad 2 USD in
  2. drugi: /*\$[0-1]\.[0-9][0-9] */ išče vrstice s ceno živil, nižjo od 2 USD.

To se zgodi, v datoteki so štiri polja, ko vzorec eden naleti na vrstico s ceno prehrambenega izdelka, višjo od 2 USD, natisne vsa štiri polja in znak (*) na koncu črta kot zastava.

Drugi vzorec preprosto natisne druge vrstice s ceno hrane, nižjo od 2 USD, kot so prikazane v vhodni datoteki, food_prices.list.

Tako lahko z vzorci, določenimi za vzorce, filtrirate živilske izdelke, katerih cena je višja od 2 USD, čeprav je težava z izhodom, vrstice z znakom (*) niso oblikovane tako kot preostalih vrstic, zaradi česar izhod ni dovolj jasen.

Isti problem smo videli v 2. delu serije awk, vendar ga lahko rešimo na dva načina:

1. Uporaba ukaza printf, ki je dolg in dolgočasen način z uporabo spodnjega ukaza:

$ 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. Uporaba polja $0. Awk s spremenljivko 0 shrani celotno vnosno vrstico. To je priročno za reševanje zgornjega problema in je preprosto in hitro, kot sledi:

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

Zaključek

Za zdaj je to to in to so preprosti načini filtriranja besedila z uporabo posebnega dejanja, ki lahko pomaga pri označevanju vrstic besedila ali nizov v datoteki z ukazom Awk.

Upam, da vam je ta članek koristen in ne pozabite prebrati naslednjega dela serije, ki se bo osredotočil na uporabo primerjalnih operaterjev z orodjem awk.