我有一个文件,我需要其中的模式出现在另一个模式之前,如下所示:
PAT1
coord
data
data
PAT1
coord
data
data
data
PAT1
coord
data
PAT2
PAT1
coord
...
PAT1
该文件将始终具有--> coord
-->流data
,但并不总是有PAT2
after data
。想要的输出:coord
-- PAT2 和紧邻其之前的 PAT1 之间的输出。
也就是说,预期输出应该是:
coord
由于给出的示例中只有一个 PAT2。
我一直在这个网站和其他网站上查看大量问题和答案,但找不到任何正确的内容。例如:
如果每个 PAT1 都有一个 PAT2,那就太好了-
https://stackoverflow.com/questions/38972736/how-to-print-lines- Between-two-patterns-inclusive-or-exclusive-in-sed-awk-or/38972737#38972737
coord
如果PAT2- 中有一定数量的线路,这个答案会很方便
awk 仅在其他匹配之前的最后一条记录时打印匹配
等等。
非常感谢任何建议。我对任何方法(sed、awk、grep 等)持开放态度。
答案1
更具代表性的示例输入将与行编号相同,以便识别我们要打印到输出的哪一行。
> nl file
1 PAT1
2 coord
3 data
4 data
5 PAT1
6 coord
7 data
8 data
9 data
10 PAT1
11 coord
12 data
13 PAT2
14 PAT1
15 coord
仅当在和之间找到时,此awk
命令才会打印包含该模式的行,并且该块中不会出现这两个模式。coord
PAT1
PAT2
awk '/PAT1/{f=1; p=""} p && /PAT2/{print p; exit} f && /coord/{p=$0}' <(nl file)
11 coord
f
用于指示PAT1
已找到,该标志用于激活任何coord
后续的匹配。p
每个找到的内容也会被清空PAT1
,这确保我们不会为类似的情况打印任何内容PAT1 coord PAT1 text PAT2
。
另外,exit
在打印后,如果我们想查找更多信息,我们可以通过重置标志来替换它。