Hvernig á að nota Awk til að sía texta eða strengi með því að nota mynstursértækar aðgerðir


Í þriðja hluta Awk skipana röðarinnar munum við skoða síun texta eða strengja út frá sérstökum mynstrum sem notandi getur skilgreint.

Stundum, þegar þú síar texta, vilt þú tilgreina ákveðnar línur úr inntaksskrá eða línur af strengjum út frá tilteknu ástandi eða með því að nota ákveðið mynstur sem hægt er að passa saman. Það er mjög auðvelt að gera þetta með Awk, það er einn af frábæru eiginleikum Awk sem þér mun finnast gagnlegt.

Við skulum skoða dæmi hér að neðan, segjum að þú sért með innkaupalista fyrir matvöru sem þú vilt kaupa, sem heitir food_prices.list. Það hefur eftirfarandi lista yfir matvörur og verð þeirra.

$ 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

Og þá viltu gefa til kynna (*) merki á matvöru sem er hærra verð en $2, þetta er hægt að gera með því að keyra eftirfarandi skipun:

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

Af úttakinu hér að ofan geturðu séð að það er (*) merki í lok línanna með matvælum, mangó og ananas. Ef þú athugar verð þeirra eru þau yfir $2.

Í þessu dæmi höfum við notað tvö mynstur:

  1. það fyrsta: / *\$[2-9]\.[0-9][0-9] */ fær línurnar sem hafa matvöruverð hærra en $2 og
  2. síðan: /*\$[0-1]\.[0-9][0-9] */ leitar að línum með verð á matvöru undir $2.

Þetta er það sem gerist, það eru fjórir reiti í skránni, þegar mynstur eitt rekst á línu með matvöruverð hærra en $2, prentar það alla fjóra reiti og (*) merki í lok línuna sem fáni.

Annað mynstur prentar einfaldlega aðrar línur með matarverð undir $2 eins og þær birtast í inntaksskránni, food_prices.list.

Þannig geturðu notað mynstur sérstakar aðgerðir til að sía út matvörur sem eru verðlagðar yfir $2, þó að það sé vandamál með úttakið, eru línurnar sem hafa (*) merkið ekki sniðnar eins og restin af línunum sem gerir úttakið ekki nógu skýrt.

Við sáum sama vandamálið í hluta 2 af awk seríunni, en við getum leyst það á tvo vegu:

1. Notaðu printf skipunina sem er löng og leiðinleg leið með því að nota skipunina hér að neðan:

$ 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. Notaðu $0 reit. Awk notar breytuna 0 til að geyma alla inntakslínuna. Þetta er vel til að leysa vandamálið hér að ofan og það er einfalt og fljótlegt sem hér segir:

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

Niðurstaða

Það er það í bili og þetta eru einfaldar leiðir til að sía texta með því að nota mynstursértæka aðgerð sem getur hjálpað til við að flagga textalínur eða strengi í skrá með Awk skipun.

Vona að þér finnist þessi grein gagnleg og mundu að lesa næsta hluta seríunnar sem mun leggja áherslu á að nota samanburðartæki sem nota awk tól.