Kā lietot Awk, lai filtrētu tekstu vai virknes, izmantojot specifiskas modeļa darbības


Awk komandu sērijas trešajā daļā apskatīsim teksta vai virkņu filtrēšanu, pamatojoties uz īpašiem modeļiem, kurus lietotājs var definēt.

Dažreiz, filtrējot tekstu, vēlaties norādīt noteiktas rindas no ievades faila vai virkņu rindas, pamatojoties uz noteiktu nosacījumu vai izmantojot noteiktu modeli, kuru var saskaņot. To izdarīt ar Awk ir ļoti viegli, tā ir viena no Awk lieliskajām īpašībām, kas jums būs noderīga.

Apskatīsim zemāk redzamo piemēru, pieņemsim, ka jums ir pārtikas preču iepirkšanās saraksts, ko vēlaties iegādāties, ar nosaukumu food_prices.list. Tajā ir šāds pārtikas produktu saraksts un to cenas.

$ 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

Pēc tam jūs vēlaties norādīt (*) zīmi uz pārtikas precēm, kuru cena ir lielāka par $2 , to var izdarīt, izpildot šādu komandu:

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

No iepriekš minētās izejas jūs varat redzēt, ka rindu beigās ir zīme (*) , kurās ir pārtikas preces, mango un ananāsi. Ja pārbaudāt viņu cenas, tās pārsniedz 2 USD.

Šajā piemērā mēs izmantojām divus modeļus:

  1. pirmais: /*\$[2-9] \. [0-9] [0-9] */ iegūst rindas, kuru pārtikas produktu cena pārsniedz 2 USD un
  2. otrais: /*\$[0-1]\.[0-9][0-9] */ meklē rindas, kurās pārtikas preču cena ir mazāka par 2 USD.

Tas notiek, failā ir četri lauki, kad pirmais raksts saskaras ar rindu ar pārtikas preces cenu, kas ir lielāka par 2 ASV dolāriem, tas izdrukā visus četrus laukus un (*) zīmi līnija kā karogs.

Otrais modelis vienkārši izdrukā citas līnijas ar pārtikas cenu, kas ir mazāka par 2 ASV dolāriem, kā tās parādās ievades failā food_prices.list.

Tādā veidā jūs varat izmantot specifiskas darbības, lai filtrētu pārtikas preces, kuru cena ir lielāka par 2 ASV dolāriem, lai gan ir izejas problēma, līnijas, kurām ir zīme (*) , nav formatētas tāpat kā pārējās līnijas, padarot izvadi pietiekami skaidru.

Mēs redzējām to pašu problēmu awk sērijas 2. daļā, taču mēs to varam atrisināt divos veidos:

1. Izmantojot komandu printf, kas ir garš un garlaicīgs veids, izmantojot zemāk esošo komandu:

$ 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. Izmantojot lauku $0. Awk izmanto mainīgo 0, lai saglabātu visu ievades līniju. Tas ir ērti, lai atrisinātu iepriekš minēto problēmu, un tas ir vienkārši un ātri šādi:

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

Secinājums

Pagaidām tas ir viss, un tie ir vienkārši teksta filtrēšanas veidi, izmantojot paraugam raksturīgu darbību, kas var palīdzēt atzīmēt faila teksta vai virknes, izmantojot komandu Awk.

Ceru, ka šis raksts jums būs noderīgs, un atcerieties izlasīt nākamo sērijas daļu, kas koncentrēsies uz salīdzināšanas operatoru izmantošanu, izmantojot awk rīku.