Kaip naudoti „Awk“ tekstui ar eilėms filtruoti naudojant specifinius šablono veiksmus


Trečioje Awk komandų serijos dalyje apžvelgsime teksto arba eilučių filtravimą pagal konkrečius šablonus, kuriuos gali apibrėžti vartotojas.

Kartais, filtruojant tekstą, norite nurodyti tam tikras eilutes iš įvesties failo arba eilučių eilutes pagal tam tikrą sąlygą arba naudojant konkretų šabloną, kurį galima suderinti. Tai padaryti naudojant Awk yra labai paprasta, tai yra viena iš puikių Awk funkcijų, kuri jums bus naudinga.

Pažvelkime į toliau pateiktą pavyzdį, tarkime, kad turite norimų įsigyti maisto produktų pirkinių sąrašą, pavadintą maisto_kainų sąrašas. Jame yra toks maisto prekių sąrašas ir jų kainos.

$ 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

Ir tada, jei norite nurodyti (*) ženklą ant maisto produktų, kurių kaina didesnė nei $2, tai galima padaryti vykdant šią komandą:

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

Iš aukščiau pateiktos išvesties matote, kad eilučių su maisto produktais, mangais ir ananasais pabaigoje yra ženklas (*) >. Jei patikrinsite jų kainas, jos viršija 2 USD.

Šiame pavyzdyje mes panaudojome du modelius:

  1. pirmoji: / *\$[2-9]\.[0-9][0-9] */ gauna eilutes, kurių maisto produktų kaina didesnė nei 2 USD > ir
  2. antrasis: /*\$[0-1]\.[0-9][0-9] */ ieško eilučių, kuriose maisto produkto kaina mažesnė nei 2 USD .

Taip atsitinka, faile yra keturi laukai, kai pirmasis šablonas susiduria su eilute, kurios maisto prekės kaina didesnė nei 2 USD, išspausdinami visi keturi laukai ir (*) ženklas eilutės pabaigoje kaip vėliavėlė.

Antrasis šablonas tiesiog spausdina kitas eilutes, kuriose maisto kaina yra mažesnė nei 2 USD, kaip jos rodomos įvesties faile maisto_kainos.list.

Tokiu būdu galite naudoti konkrečius modelio veiksmus, kad išfiltruotumėte maisto produktus, kurių kaina didesnė nei 2 USD, nors yra problemų su išvestimi, eilutėmis, kuriose yra (*) ženklas nėra suformatuotas kaip kitos eilutės, todėl išvestis nėra pakankamai aiški.

Tą pačią problemą matėme awk serijos 2 dalyje, tačiau galime ją išspręsti dviem būdais:

1. Komandos printf naudojimas, kuris yra ilgas ir nuobodus būdas naudojant toliau pateiktą komandą:

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. Naudojant $0 lauką. Awk naudoja kintamąjį 0, kad išsaugotų visą įvesties eilutę. Tai patogu sprendžiant aukščiau pateiktą problemą ir yra paprasta bei greita taip:

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

Išvada

Tai yra paprasti būdai filtruoti tekstą naudojant specifinį šablono veiksmą, kuris gali padėti pažymėti teksto eilutes arba eilutes faile naudojant komandą Awk.

Tikimės, kad šis straipsnis bus naudingas ir nepamirškite perskaityti kitos serijos dalies, kurioje pagrindinis dėmesys bus skiriamas palyginimo operatorių naudojimui naudojant awk įrankį.