[英]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.