AWK: сокращенное if-then-else с регулярным выражением - программирование

AWK: сокращенное if-then-else с регулярным выражением

Следующий формат AWK:

/REGEX/ {Action}

Выполняет Action, если текущая строка соответствует REGEX.

Есть ли способ добавить предложение else, которое будет выполнено, если текущая строка не соответствует регулярному выражению, не используя явно, если -то-то явно, что-то вроде:

/REGEX/ {Action-if-matches} {Action-if-does-not-match}
4b9b3361

Ответ 1

Не так коротко:

/REGEX/ {Action-if-matches} 
! /REGEX/ {Action-if-does-not-match}

Но (g) awk также поддерживает тернарный оператор:

{ /REGEX/  ? matching=1 : matching = 0 ; if ( matching ==1 ) { matching_action } else { notmatching_action } }

UPDATE:

По словам великого Гленна Джекмана, вы можете назначить переменные в матче, например:

m = /REGEX/ { matching-action } !m { NOT-matching-action }

Ответ 2

Там также next:

/REGEX/ {
    Action
    next # skip to the next line
}
{ will only get here if the current line does *not* match /REGEX/ }

Ответ 3

Вы можете сделать "трюк". Как вы знаете, AWK пытается сопоставить ввод для каждого регулярного выражения в порядке, чтобы выполнить его блок.

Этот код выполняет второй блок, если $1 является "1", иначе он выполняет третий блок:

awk '{used = 0} $1 == 1 {print $1" is 1 !!"; used = 1;} used == 0 {print $1" is not 1 !!";}'

Если вход:

1
2

Он печатает:

1 is 1 !!
2 is not 1 !!