Поиск по сайту:

Как использовать Awk для фильтрации текста или строк с использованием действий, специфичных для шаблона


В третьей части серии команд Awk мы рассмотрим фильтрацию текста или строк на основе определенных шаблонов, которые может определить пользователь.

Иногда при фильтрации текста требуется указать определенные строки из входного файла или строки строк на основе заданного условия или с использованием определенного шаблона, который можно сопоставить. Сделать это с помощью Awk очень просто, это одна из замечательных функций Awk, которая может оказаться вам полезной.

Давайте рассмотрим пример ниже. Предположим, у вас есть список продуктов питания, которые вы хотите купить, который называется food_prices.list. Он имеет следующий список продуктов питания и их цены.

$ 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

Затем вы хотите указать знак (*) на продуктах питания, цена которых превышает $2, это можно сделать, выполнив следующую команду:

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

Из приведенного выше вывода вы можете видеть, что в конце строк, содержащих продукты питания, манго и ананасы, есть знак (*). >. Если вы посмотрите их цены, они превышают 2 доллара США.

В этом примере мы использовали два шаблона:

  1. первый: / *\$[2-9]\.[0-9][0-9] */ получает строки, в которых цена на продукты питания превышает 2 доллара США . и
  2. второй: /*\$[0-1]\.[0-9][0-9] */ ищет строки с ценой на продукты питания менее $2 .

Вот что происходит: в файле четыре поля, и когда первый шаблон встречает строку с ценой на продукты питания, превышающую $2, он печатает все четыре поля и (*) знак в конце строки как флаг.

Второй шаблон просто печатает остальные строки с ценой на продукты питания менее 2$ в том виде, в котором они указаны во входном файле food_prices.list.

Таким образом, вы можете использовать действия, специфичные для шаблона, чтобы отфильтровать продукты питания по цене выше 2 долларов США, хотя при выводе возникают проблемы: строки с (*) знак не отформатирован, как остальные строки, что делает вывод недостаточно ясным.

Мы видели ту же проблему во второй части серии статей по awk, но решить ее можно двумя способами:

1. Использование команды printf, которая является долгим и скучным способом, с использованием приведенной ниже команды:

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. Использование поля $0. Awk использует переменную 0 для хранения всей строки ввода. Это удобно для решения описанной выше проблемы, оно просто и быстро выглядит следующим образом:

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

Заключение

На данный момент это все, и это простые способы фильтрации текста с использованием действий, специфичных для шаблона, которые могут помочь пометить строки текста или строки в файле с помощью команды Awk.

Надеюсь, эта статья окажется для вас полезной, и не забудьте прочитать следующую часть серии, в которой основное внимание будет уделено использованию операторов сравнения с помощью инструмента awk.