gpt4 book ai didi

awk - 如何选择两个相似图案之间的线条

转载 作者:行者123 更新时间:2023-12-04 03:01:34 25 4
gpt4 key购买 nike

我有一个包含如下文本 block 的文本文件:

IN
hit
ER 123 hit 456
abc
hit
ghi
ER 789 hit 012
abc
ghi
IN 345
abc
def
ghi
ER 678 xxx 901
xyz
hit
xyz
IN
risk
in

block 可以有任意数量的行,但始终以包含 ER 或 IN 的行开头。

如何使用 awk 选择出现在两个相似标记模式之间的线?

1) 可能有多个部分标有这些模式。

2) 模式之间的选定线之一必须包含另一个模式(例如命中)

3) 应包含具有第一个模式(例如 ER)的行,应排除具有第二个模式(例如 ER|IN)的行。

预期输出:

ER 123 hit 456
abc
hit
ghi
ER 678 xxx 901
xyz
hit
xyz

我已经努力实现我的目标

awk '/ER/ {block=1} block {str=str sep $0; sep=RS} /ER|IN/ {block=0; if (str~/hit/) {print str} str=sep=""}'

但它给了我

ER abc hit ghi
ER 789 hit 012

编辑:我的示例不够精确。编辑2:

a) 我试图找到行匹配模式“ER”b)我搜索最近的下一行匹配模式“ER ”或“IN ”c) 仅当我的结果包含至少一行匹配模式“.hit.”时我才想打印结果,但它不能是第一行。结果应包括第一行,但不包括最后一行,因此:

ER 678 xxx 901
xyz
hit
xyz

应该打印,因为在行匹配“ER”和行匹配“IN”之间的 block 中有一行匹配命中

ER 789 hit 012
abc
ghi

不应打印,因为在行匹配“ER”和行匹配“IN”之间的 block 中没有行匹配命中

最佳答案

能否请您尝试关注并告诉我这是否对您有帮助。

awk '
/ER/ && val{
if(hit_flag){
print val};
val=hit_flag=token=in_er_token=""
}
/ER/ && !val{
val=$0;
token=1
next
}
val && token && (/[Hh][Ii][Tt]/){
hit_flag=1
}
val && token && (/ER/ || /[Ii][Nn]/){
if(val){
in_er_token=1
};
next}
!in_er_token{
val=val?val ORS $0:$0
}
END{
if(val && hit_flag){
print val}
}
' Input_file

关于awk - 如何选择两个相似图案之间的线条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48746079/

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