我有一个文本文件,其中包含这样的文本块:
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
区块可以有任意数量的行,但始终以包含 ER 或 IN 的行开头。
使用 awk,如何选择出现在两个类似标记模式之间的行?
1)可能会有多个用这些模式标记的部分。
2)在模式之间选定的行必须包含另一个模式(例如 hit)
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”行之间的块中有一行与“hit”匹配。
ER 789 hit 012
abc
ghi
由于在匹配“ER”和匹配“IN”的行之间的块中没有匹配“hit”的行,因此不应打印。
ER 678 xxx 901 xyz hit xyz IN risk IN
,它会输出:ER 678 xxx 901 xyz hit xyz risk
。 - BartoszIN
的行被跳过,并且打印了带risk
的行。它不在ER
和ER | IN
行之间。更新示例。 - Bartosz