我正在尝试使用关键字从很长的列表中选择一些论文标题。
这是针对此问题而简化的示例行。
tolower($0) ~ /model selection/ || tolower($0) ~ /structure learning/{print}
在这一行中,我要打印包含“模型选择”或“结构学习”的任何行。但是对于在命令行中添加的每个模式,我都必须放置此tolower($0) ~
表达式。否则,awk将不会打印包含Model selection
或Structure 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()一次。
答案 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} }'