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

Как использовать команду «next» с Awk в Linux — часть 6


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

Команда next помогает вам предотвратить выполнение того, что я бы назвал шагами, отнимающими время при выполнении команды.

Чтобы понять, как это работает, давайте рассмотрим файл food_list.txt, который выглядит следующим образом:

No      Item_Name               Price           Quantity
1       Mangoes                 $3.45              5
2       Apples                  $2.45              25
3       Pineapples              $4.45              55
4       Tomatoes                $3.45              25
5       Onions                  $1.45              15
6       Bananas                 $3.45              30

Рассмотрите возможность запуска следующей команды, которая будет помечать продукты питания, количество которых меньше или равно 20, знаком (*) в конце каждой строки:

# awk '$4 <= 20 { printf "%s\t%s\n", $0,"*" ; } $4 > 20 { print $0 ;} ' food_list.txt 

No	Item_Name		Price		Quantity
1	Mangoes			$3.45		   5	*
2	Apples			$2.45              25
3	Pineapples		$4.45              55
4	Tomatoes		$3.45              25 
5	Onions			$1.45              15	*
6	Bananas	                $3.45              30

Команда выше на самом деле работает следующим образом:

  1. Сначала он проверяет, меньше ли количество (четвертое поле каждой строки ввода) или равно 20. Если значение соответствует этому условию, оно печатается и помечается тегом (*) . подпишите в конце, используя первое выражение: $4 <= 20
  2. Во-вторых, он проверяет, превышает ли четвертое поле каждой входной строки 20, и если строка соответствует условию, она печатается с использованием второго выражения: $4 > 20

Но здесь есть одна проблема: когда первое выражение выполняется, строка, которую мы хотим пометить, печатается с помощью: { printf "%s\t%s\n", $0, "**" ; , а затем на том же этапе также проверяется второе выражение, что приводит к потере времени.

Таким образом, нет необходимости снова выполнять второе выражение, $4 > 20 после печати уже помеченных строк, которые были напечатаны с использованием первого выражения.

Чтобы решить эту проблему, вам нужно использовать команду next следующим образом:

# awk '$4 <= 20 { printf "%s\t%s\n", $0,"*" ; next; } $4 > 20 { print $0 ;} ' food_list.txt

No	Item_Name		Price		Quantity
1	Mangoes			$3.45		   5	*
2	Apples			$2.45              25
3	Pineapples		$4.45              55
4	Tomatoes		$3.45              25 
5	Onions			$1.45              15	*
6	Bananas	                $3.45              30

После того, как одна входная строка напечатана с использованием $4 <= 20 { printf "%s\t%s\n", $0,"*" ; следующий ; , включенная команда next поможет пропустить второе выражение $4 > 20 { print $0 ;, поэтому выполнение переходит к следующую строку ввода без необходимости тратить время на проверку того, превышает ли количество 20.

Команда next очень важна для написания эффективных команд, и при необходимости вы всегда можете использовать ее для ускорения выполнения скрипта. Подготовьтесь к следующей части серии, где мы рассмотрим использование стандартного ввода (STDIN) в качестве входных данных для Awk.

Надеюсь, это руководство окажется для вас полезным, и вы, как всегда, сможете изложить свои мысли в письменной форме, оставив комментарий в разделе комментариев ниже.