Kuinka suodattaa tekstiä tai merkkijonoja Awk: lla mallikohtaisilla toiminnoilla


Awk-komentosarjan kolmannessa osassa tarkastellaan tekstin tai merkkijonojen suodatusta käyttäjien määrittelemien erityisten mallien perusteella.

Joskus, kun suodatat tekstiä, haluat ilmoittaa tietyt rivit syötetiedostosta tai merkkijonorivit tietyn ehdon perusteella tai käyttämällä tiettyä sopivaa mallia. Tämän tekeminen Awkin kanssa on erittäin helppoa, se on yksi Awkin suurimmista ominaisuuksista, josta löydät apua.

Katsotaanpa alla olevaa esimerkkiä, esimerkiksi että sinulla on ostoslista elintarvikkeille, jotka haluat ostaa, nimeltään food_prices.list. Siinä on seuraava luettelo elintarvikkeista ja niiden hinnoista.

$ 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 sitten haluat osoittaa (*) -merkin elintarvikkeisiin, joiden hinta on suurempi kuin $2 , tämä voidaan tehdä suorittamalla seuraava komento:

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

Yllä olevasta lähdöstä näet, että rivien lopussa on (*) -merkki, jossa on elintarvikkeita, mangoja ja ananasta. Jos tarkistat heidän hinnat, ne ovat yli 2 dollaria.

Tässä esimerkissä olemme käyttäneet kahta mallia:

  1. ensimmäinen: /*\$[2-9] \. [0-9] [0-9] */ saa rivit, joiden ruoan hinta on yli 2 dollaria ja
  2. toinen: /*\$[0-1]\.[0-9][0-9] */ etsii rivejä, joiden elintarvikkeiden hinta on alle 2 dollaria.

Näin tapahtuu, tiedostossa on neljä kenttää. Kun kuvio kohtaa rivin, jonka elintarvikehinta on yli 2 dollaria, se tulostaa kaikki neljä kenttää ja (*) -merkin viiva lippuna.

Toinen kuvio yksinkertaisesti tulostaa muut rivit, joiden ruoan hinta on alle 2 dollaria, kun ne näkyvät syötetiedostossa food_prices.list.

Tällä tavalla voit suodattaa kaavakohtaisia toimintoja yli 2 dollarin hinnalla oleviin ruokiin, vaikka tuotoksessa on ongelma, rivejä, joilla on (*) -merkki, ei ole muotoiltu kuten loput linjat, jolloin tulos ei ole riittävän selkeä.

Näimme saman ongelman awk-sarjan osassa 2, mutta voimme ratkaista sen kahdella tavalla:

1. Käyttämällä printf-komentoa, joka on pitkä ja tylsä tapa käyttää alla olevaa komentoa:

$ 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. Käytä $0 -kenttää. Awk käyttää muuttujaa 0 koko syöttörivin tallentamiseen. Tämä on kätevä ratkaisemaan yllä oleva ongelma ja se on yksinkertainen ja nopea seuraavasti:

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

Johtopäätös

Se on nyt, ja nämä ovat yksinkertaisia tapoja suodattaa tekstiä mallikohtaisella toiminnolla, joka voi auttaa merkitsemään tiedoston tekstirivejä tai merkkijonoja Awk-komennolla.

Toivottavasti löydät tämän artikkelin hyödyllisenä ja muista lukea sarjan seuraava osa, jossa keskitytään vertailuoperaattoreiden käyttämiseen awk-työkalulla.