在awk中,如何在通用tolower()操作后搜索复杂的模式组合

时间:2019-04-19 03:02:48

标签: awk

我正在尝试使用关键字从很长的列表中选择一些论文标题。
这是针对此问题而简化的示例行。

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

在这一行中,我要打印包含“模型选择”或“结构学习”的任何行。但是对于在命令行中添加的每个模式,我都必须放置此tolower($0) ~表达式。否则,awk将不会打印包含Model selectionStructure learning的行。是否没有方法将模式after应用于lower($ 0)〜函数?

发布此问题后,我意识到我真正想要做的是对tolower($ 0)的输出使用逻辑模式操作,类似于(如果我想用pattern1 and (pattern2 or pattern3)打印行)

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

不重复tolower()..我也想用tolower()搜索模式,例如$ 0中的/ RL /。
当然可以

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

但是我只想使用tolower()一次。

2 个答案:

答案 0 :(得分:2)

使用GNU awk进行IGNORECASE(因为您可以使用tolower($ 0),但实际上没有必要,但仅供参考)并切换语句:

{
    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/

它们是正则表达式,而不是模式。

答案 1 :(得分:0)

IGNORECASE设置是gnu awk功能

awk 'BEGIN{IGNORECASE=1} {$0 ~ /pattern1&(pattern2|pattern3)/ {print}  }'