首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >regex中字段的使用值

regex中字段的使用值
EN

Stack Overflow用户
提问于 2015-02-20 02:29:50
回答 1查看 224关注 0票数 5

我试图从字段$5中的相同记录中找到一个字符串模式,该字符串模式由单词结论和字段$2和字段$3的值组成。

例如,my_file.txt是由“AC.26”分隔的:

代码语言:javascript
运行
复制
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...|

因此,在本例中,我只想打印第一条记录,因为它有“结论”一词,后面跟着substance1,然后是substance2

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

代码语言:javascript
运行
复制
awk 'BEGIN{FS="|";IGNORECASE=1}{if ($5 ~ /CONCLUSIONS.*$2.*$3/) {print $0}}' my_file.txt

任何帮助都非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-20 02:53:30

代码语言:javascript
运行
复制
$ 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将执行默认操作,即打印行。

更简单的例子

考虑:

代码语言:javascript
运行
复制
$ echo "aa aa" | awk '$2 ~ /$1/'

这一行不输出任何内容,因为awk不能代替正则表达式中的变量。

请注意,这里也没有找到匹配的:

代码语言:javascript
运行
复制
$ echo '$1' | awk '$0 ~ /$1/'

这里没有匹配,因为在正则表达式中,$只在行尾匹配。因此,/$1/将只匹配行的末尾,后面跟着一个1。如果我们想在这里找到一个匹配的,我们需要逃离美元的标志:

代码语言:javascript
运行
复制
$ echo '$1' | awk '$0 ~ /\$1/'
$1

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

代码语言:javascript
运行
复制
$ echo "aa aa" | awk '$2 ~ $1'
aa aa

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

进一步的改进

正如埃德·莫顿( important )在评论中所暗示的那样,坚持这些物质只与整句话相符可能是很重要的。在这种情况下,我们可以使用\\<...\\>限制物质匹配为整字。因此:

代码语言:javascript
运行
复制
awk 'BEGIN{FS="|";IGNORECASE=1} $5 ~ "conclusions.*\\<" $2 "\\>.*\\<" $3 "\\>"' my_file.txt

这样,substance1将与substance10不匹配。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28620722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档