Weboldal keresés

Az Awk használata szöveg vagy karakterláncok szűrésére mintaspecifikus műveletek segítségével


Az Awk parancssorozat harmadik részében egy pillantást vetünk a szövegek vagy karakterláncok szűrésére a felhasználó által meghatározott minták alapján.

Néha a szöveg szűrésekor egy bemeneti fájl bizonyos sorait vagy karakterláncok sorait kívánja jelezni egy adott feltétel alapján, vagy egy meghatározott minta segítségével, amely megfeleltethető. Ezt az Awk segítségével nagyon egyszerű megtenni, ez az Awk egyik nagyszerű funkciója, amelyet hasznosnak talál.

Vessünk egy pillantást az alábbi példára, mondjuk, hogy van egy bevásárlólistája azokhoz az élelmiszerekhez, amelyeket meg szeretne vásárolni, az úgynevezett food_prices.list. A következő élelmiszerek listája és áraik találhatók rajta.

$ 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

Ezután egy (*) jelet szeretne jelezni azokon az élelmiszereken, amelyek ára nagyobb, mint $2, ezt a következő parancs futtatásával teheti meg:

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

A fenti kimenetből láthatja, hogy az élelmiszereket, mangót és ananászt tartalmazó sorok végén egy (*) jel található. >. Ha megnézi az áraikat, 2 USD felett vannak.

Ebben a példában két használt mintát használtunk:

  1. az első: / *\$[2-9]\.[0-9][0-9] */ megkapja azokat a sorokat, amelyekben az élelmiszerek ára nagyobb, mint 2 USD > és
  2. a második: /*\$[0-1]\.[0-9][0-9] */ olyan sorokat keres, amelyekben az élelmiszerek ára kevesebb, mint 2 USD .

Ez történik: négy mező van a fájlban, amikor az első minta egy olyan sort talál, amelynél az élelmiszerek ára nagyobb, mint 2 USD, kinyomtatja mind a négy mezőt és egy (*)ot. kód> jel a sor végén zászlóként.

A második minta egyszerűen kinyomtatja a többi, 2 dollárnál kisebb élelmiszerárat tartalmazó sorokat, ahogyan azok az food_prices.list bemeneti fájlban szerepelnek.

Így a mintaspecifikus műveletek segítségével kiszűrheti azokat az élelmiszereket, amelyek ára meghaladja a 2 USD árat, bár probléma van a kimenettel, a (*)-t tartalmazó sorokkal. jel nincs úgy formázva, mint a többi sor, így a kimenet nem elég egyértelmű.

Ugyanezt a problémát láttuk az awk sorozat 2. részében is, de kétféleképpen tudjuk megoldani:

1. A printf parancs használata, ami hosszú és unalmas út az alábbi parancs használatával:

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. A $0 mező használata. Az Awk a 0 változót használja a teljes beviteli sor tárolására. Ez praktikus a fenti probléma megoldásához, és az alábbiak szerint egyszerű és gyors:

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

Következtetés

Egyelőre ennyi, és ezek a szövegek mintaspecifikus műveletekkel történő egyszerű szűrési módjai, amelyek segíthetnek a fájlban lévő szövegsorok vagy karakterláncok megjelölésében az Awk paranccsal.

Reméljük, hogy hasznosnak találja ezt a cikket, és ne felejtse el elolvasni a sorozat következő részét, amely az összehasonlító operátorok awk eszköz használatával történő használatára összpontosít.