Kuidas kasutada Awki teksti või stringide filtreerimiseks mustrispetsiifiliste toimingute abil


Awk-käsu seeria kolmandas osas vaatame teksti või stringide filtreerimist konkreetsete mustrite põhjal, mida kasutaja saab määratleda.

Mõnikord on teksti filtreerimisel soovitud sisendfailist või stringiridadest teatavad read tähistada antud tingimuse alusel või konkreetse sobitatava mustri abil. Selle tegemine Awkiga on väga lihtne, see on üks Awki suurepäraseid omadusi, millest leiate abi.

Heitkem pilk allpool olevale näitele. Oletame, et teil on ostetavate toiduainete ostunimekiri nimega food_prices.list. Sellel on järgmine toidukaupade loetelu ja nende hinnad.

$ 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

Ja siis soovite märkida (*) märgi toiduainetele, mille hind on suurem kui $2 , seda saab teha järgmise käsu käivitamisega:

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

Ülaltoodud väljundist näete, et ridade lõpus on märk (*) , millel on toiduained, mangod ja ananassid. Kui kontrollite nende hindu, on need kõrgemad kui 2 dollarit.

Selles näites oleme kasutanud kahte mustrit:

  1. esimene: /*\$[2-9] \. [0-9] [0-9] */ saab read, mille toidukaupade hind on suurem kui 2 USD ja
  2. teine: /*\$[0-1]\.[0-9][0-9] */ otsib ridu, mille toidukaupade hind on väiksem kui 2 dollarit.

Nii juhtub, failis on neli välja, kui muster vastab reale, mille toiduainete hind on suurem kui 2 dollarit, prindib see kõik neli välja ja märgi (*) joon lipuna.

Teine muster prindib lihtsalt teised read, mille toidu hind on alla 2 dollari, nagu need ilmuvad sisendfailis food_prices.list.

Nii saate kasutada mustrispetsiifilisi toiminguid toiduainete filtreerimiseks, mille hind on suurem kui 2 dollarit, ehkki väljundis on probleem, ridu, millel on märk (*) , ei vormistata nagu ülejäänud read, mistõttu väljund pole piisavalt selge.

Nägime sama probleemi awk-seeria 2. osas, kuid saame selle lahendada kahel viisil:

1. Kasutades käsku printf, mis on pikk ja igav viis, kasutades järgmist käsku:

$ 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. Kasutage välja $0. Awk kasutab muutuja 0 kogu sisendjoone salvestamiseks. See on ülaltoodud probleemi lahendamiseks mugav ning see on lihtne ja kiire järgmiselt:

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

Järeldus

Praegu on see kõik ja need on lihtsad viisid teksti filtreerimiseks mustrispetsiifiliste toimingute abil, mis aitavad käsku Awk faili tekstiridade või stringide märgistamisel.

Loodetavasti leiate sellest artiklist abi ja pidage meeles lugeda sarja järgmist osa, mis keskendub võrdlusoperaatorite kasutamisele awk-tööriista abil.