Hvordan bruke Awk til å filtrere tekst eller strenger ved å bruke mønsterspesifikke handlinger


I den tredje delen av Awk-kommandoserien skal vi ta en titt på filtrering av tekst eller strenger basert på spesifikke mønstre som en bruker kan definere.

Noen ganger, når du filtrerer tekst, vil du indikere bestemte linjer fra en inndatafil eller linjer med strenger basert på en gitt tilstand eller ved å bruke et spesifikt mønster som kan matches. Å gjøre dette med Awk er veldig enkelt, det er en av de flotte funksjonene til Awk som du vil finne nyttig.

La oss ta en titt på et eksempel nedenfor, si at du har en handleliste for matvarer du vil kjøpe, kalt food_prices.list. Den har følgende liste over matvarer og deres priser.

$ 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 så vil du angi et (*)-tegn på matvarer hvis pris er høyere enn $2, dette kan gjøres ved å kjøre følgende kommando:

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

Fra utdataene ovenfor kan du se at det er et (*)-tegn på slutten av linjene med matvarer, mango og ananas . Hvis du sjekker prisene deres, er de over $2.

I dette eksemplet har vi brukt to mønstre:

  1. den første: / *\$[2-9]\.[0-9][0-9] */ får linjene som har en matvarepris høyere enn $2 og
  2. den andre: /*\$[0-1]\.[0-9][0-9] */ ser etter linjer med matvarepris mindre enn $2 .

Dette er hva som skjer, det er fire felt i filen, når mønster en støter på en linje med matvarepris høyere enn $2, skriver den ut alle de fire feltene og en (*) kode> tegn på slutten av linjen som et flagg.

Det andre mønsteret skriver ganske enkelt ut de andre linjene med matpris mindre enn $2 slik de vises i inndatafilen, food_prices.list.

På denne måten kan du bruke mønsterspesifikke handlinger for å filtrere ut matvarer som er priset over $2, selv om det er et problem med utdataene, linjene som har (*) tegnet er ikke formatert som resten av linjene, noe som gjør utdataene ikke tydelige nok.

Vi så det samme problemet i del 2 av awk-serien, men vi kan løse det på to måter:

1. Bruke printf-kommandoen som er en lang og kjedelig vei ved å bruke kommandoen nedenfor:

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. Bruker $0-feltet. Awk bruker variabelen 0 for å lagre hele inndatalinjen. Dette er nyttig for å løse problemet ovenfor, og det er enkelt og raskt som følger:

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

Konklusjon

Det er det for nå, og dette er enkle måter å filtrere tekst på ved hjelp av mønsterspesifikke handlinger som kan hjelpe til med å flagge tekstlinjer eller strenger i en fil ved å bruke Awk-kommandoen.

Håper du finner denne artikkelen nyttig og husk å lese neste del av serien som vil fokusere på bruk av sammenligningsoperatorer ved å bruke awk-verktøyet.