我试图从字段$5中的相同记录中找到一个字符串模式,该字符串模式由单词结论和字段$2和字段$3的值组成。
例如,my_file.txt是由“AC.26”分隔的:
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。
这就是我正在尝试的,但它不起作用:
awk 'BEGIN{FS="|";IGNORECASE=1}{if ($5 ~ /CONCLUSIONS.*$2.*$3/) {print $0}}' my_file.txt任何帮助都非常感谢。
发布于 2015-02-20 02:53:30
$ 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这确实成功地产生了匹配。
进一步的改进
正如埃德·莫顿( important )在评论中所暗示的那样,坚持这些物质只与整句话相符可能是很重要的。在这种情况下,我们可以使用\\<...\\>限制物质匹配为整字。因此:
awk 'BEGIN{FS="|";IGNORECASE=1} $5 ~ "conclusions.*\\<" $2 "\\>.*\\<" $3 "\\>"' my_file.txt这样,substance1将与substance10不匹配。
https://stackoverflow.com/questions/28620722
复制相似问题