Vyhledávání na webu

Jak používat Awk k filtrování textu nebo řetězců pomocí akcí specifických pro vzorek


Ve třetí části série příkazů Awk se podíváme na filtrování textu nebo řetězců na základě specifických vzorů, které může uživatel definovat.

Někdy při filtrování textu chcete označit určité řádky ze vstupního souboru nebo řádky řetězců na základě dané podmínky nebo pomocí specifického vzoru, který lze porovnat. Udělat to pomocí Awk je velmi snadné, je to jedna ze skvělých funkcí Awk, která vám bude užitečná.

Podívejme se na příklad níže, řekněme, že máte nákupní seznam potravin, které si chcete koupit, nazvaný food_prices.list. Má následující seznam potravin a jejich ceny.

$ 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

A pak chcete označit znak (*) u potravin, jejichž cena je vyšší než $2, lze to provést spuštěním následujícího příkazu:

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

Z výše uvedeného výstupu můžete vidět, že na konci řádků je znak (*) obsahující potraviny, mango a ananas . Pokud se podíváte na jejich ceny, jsou vyšší než 2 $.

V tomto příkladu jsme použili dva vzory:

  1. první: / *\$[2-9]\.[0-9][0-9] */ získá řádky, které mají cenu potravin vyšší než 2 $ a
  2. druhý: /*\$[0-1]\.[0-9][0-9] */ hledá řádky s cenou potravin nižší než 2 $ .

To se stane, v souboru jsou čtyři pole, když vzor jedna narazí na řádek s cenou potravinové položky vyšší než 2 $, vytiskne všechna čtyři pole a (*) podepsat na konci řádku jako příznak.

Druhý vzor jednoduše vytiskne ostatní řádky s cenou jídla nižší než 2 $ tak, jak jsou uvedeny ve vstupním souboru food_prices.list.

Tímto způsobem můžete použít akce specifické pro určitý vzor k odfiltrování potravin, jejichž cena je vyšší než 2 $, ačkoli je problém s výstupem, řádky, které mají (*) znaménko není naformátováno jako zbytek řádků, takže výstup není dostatečně jasný.

Stejný problém jsme viděli v části 2 série awk, ale můžeme ho vyřešit dvěma způsoby:

1. Použití příkazu printf, což je dlouhý a nudný způsob použití následujícího příkazu:

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. Pomocí pole 0 $. Awk používá proměnnou 0 k uložení celého vstupního řádku. To je užitečné pro řešení výše uvedeného problému a je to jednoduché a rychlé následovně:

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

Závěr

To je prozatím vše a toto jsou jednoduché způsoby filtrování textu pomocí akce specifické pro vzorek, které mohou pomoci při označování řádků textu nebo řetězců v souboru pomocí příkazu Awk.

Doufám, že vám tento článek bude užitečný a nezapomeňte si přečíst další část série, která se zaměří na používání operátorů porovnání pomocí nástroje awk.