Как использовать команду «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
Команда выше на самом деле работает следующим образом:
- Сначала он проверяет, меньше ли количество (четвертое поле каждой строки ввода) или равно 20. Если значение соответствует этому условию, оно печатается и помечается тегом
(*)
. подпишите в конце, используя первое выражение:$4 <= 20
- Во-вторых, он проверяет, превышает ли четвертое поле каждой входной строки 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.
Надеюсь, это руководство окажется для вас полезным, и вы, как всегда, сможете изложить свои мысли в письменной форме, оставив комментарий в разделе комментариев ниже.