繁体   English   中英

AWK正则表达式中的字段使用值

[英]AWK use value of field in regex

我正在尝试从字段$ 5的同一条记录中找到由单词CONCLUSION和字段$ 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

    我们没有为此情况指定任何操作。 因此,如果条件为true, 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不匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM