gpt4 book ai didi

regex - AWK 在正则表达式中使用字段值

转载 作者:行者123 更新时间:2023-12-02 01:50:37 25 4
gpt4 key购买 nike

我正在尝试查找由单词 CONCLUSION 后跟字段 $5 中同一记录中的字段 $2 和字段 $3 的值组成的字符串模式。

例如,my_file.txt 用“|”分隔:

1|substance1|substance2|red|CONCLUSIONS: the effect of SUBSTANCE1 and SUBSTANCE2 in humans...|
2|substance3|substance4|red|Conclusions: Substance4 is not harmful...|
3|substance5|substance6|red|Substance5 interacts with substance6...|

因此,在这个示例中,我只想打印第一条记录,因为它包含单词“CONCLUSIONS”,后跟 substance1,后跟 substance2

这是我正在尝试的,但它不起作用:

awk 'BEGIN{FS="|";IGNORECASE=1}{if ($5 ~ /CONCLUSIONS.*$2.*$3/) {print $0}}' my_file.txt

非常感谢任何帮助

最佳答案

$ awk 'BEGIN{FS="|";IGNORECASE=1} $5 ~ "conclusions.*" $2 ".*" $3' my_file.txt
1|substance1|substance2|red|CONCLUSIONS: the effect of SUBSTANCE1 and SUBSTANCE2 in humans...|

它是如何工作的

  • BEGIN{FS="|";IGNORECASE=1}

    这部分与问题中的代码没有变化。

  • $5 ~ "conclusions.*" $2 ".*" $3

    这是一个条件:如果 $5 则为真匹配由四个字符串连接在一起组成的正则表达式:"conclusions.*" ,和$2 ,和".*" ,和$3 .

    我们没有指定针对这种情况采取任何操作。因此,如果条件为真,awk执行默认操作,即打印该行。

更简单的示例

考虑:

$ echo "aa aa" | awk '$2 ~ /$1/'

这一行不打印任何内容,因为 awk不替换正则表达式中的变量。

观察到这里也没有找到匹配项:

$ echo '$1' | awk '$0 ~ /$1/'

这里没有匹配项,因为在正则表达式中,$仅在行尾匹配。所以,/$1/只会匹配行尾后跟 1 。如果我们想在这里获得匹配,我们需要转义美元符号:

$ echo '$1' | awk '$0 ~ /\$1/'
$1

要获得使用 awk 变量的正则表达式,我们可以作为此答案的基础,执行以下操作:

$ echo "aa aa" | awk '$2 ~ $1'
aa aa

这确实成功地产生了匹配。

进一步改进

正如埃德·莫顿(Ed Morton)在评论中建议的那样,坚持这些物质仅在整个单词上匹配可能很重要。在这种情况下,我们可以使用 \\<...\\>将实质匹配限制为整个单词。因此:

awk 'BEGIN{FS="|";IGNORECASE=1} $5 ~ "conclusions.*\\<" $2 "\\>.*\\<" $3 "\\>"' my_file.txt

这样,substance1将不匹配 substance10 .

关于regex - AWK 在正则表达式中使用字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28620722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com