в awk, как искать сложную комбинацию паттернов после обычной операции tolower () - PullRequest
0 голосов
/ 19 апреля 2019

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

tolower($0) ~ /model selection/ || tolower($0) ~ /structure learning/{print}

С помощью этой строки я хочу напечатать любую строку, содержащую «выбор модели» или «изучение структуры».Но для каждого шаблона, который я добавляю в эту командную строку, я должен поместить это выражение tolower($0) ~.В противном случае awk не будет печатать строки, содержащие Model selection или Structure learning.Разве нет способа применить функцию pattern after tolower ($ 0) ~?

После публикации этого вопроса я понял, что я действительно хочу сделать, это использовать операцию логического шаблона с выводом tolower ($ 0), что-то вроде (если я хочу напечатать строку с pattern1 and (pattern2 or pattern3))

tolower($0) ~ /pattern1&(pattern2|pattern3)/{print}  

без повторения tolower () .. а также я хочу найти шаблон с tolower (), например / RL / в $ 0.
Конечно, я могу сделать

/RL/ || (tolower($0) ~ /pattern1/ && tolower($0) ~ /pattern2|pattern3/) {print}

Но я хочу использовать tolower () только один раз.

Ответы [ 2 ]

2 голосов
/ 19 апреля 2019

С GNU awk для IGNORECASE (на самом деле не обязательно, так как вы можете использовать tolower ($ 0), но включено для справки) и операторы switch:

{
    IGNORECASE=1
    switch($0) {
    case /model selection/:
    case /structure learning/: print
    }
}

Из ваших комментариев и обновленного вопроса и факта, который вы все еще спрашиваете, это может быть то, что вы ищете:

{ lc = tolower($0) }
lc ~ /(regexp_a)|(regexp_b)/ || /RL/

или

{ lc = tolower($0) }
lc ~ /regexp_a/ ||
lc ~ /regexp_b/ ||
/RL/

Кстати, это регулярные выражения, а не шаблоны.

0 голосов
/ 20 апреля 2019

Настройка IGNORECASE - это функция GNU AWK

awk 'BEGIN{IGNORECASE=1} {$0 ~ /pattern1&(pattern2|pattern3)/ {print}  }'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...