查找恰好在模式匹配 1 之前发生的模式匹配 2

查找恰好在模式匹配 1 之前发生的模式匹配 2

我有一个文件,我需要其中的模式出现在另一个模式之前,如下所示:

PAT1  
coord  
data  
data  
PAT1  
coord  
data  
data  
data  
PAT1  
coord  
data  
PAT2  
PAT1  
coord  
...

PAT1该文件将始终具有--> coord-->流data,但并不总是有PAT2after 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命令才会打印包含该模式的行,并且该块中不会出现这两个模式。coordPAT1PAT2

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在打印后,如果我们想查找更多信息,我们可以通过重置标志来替换它。

相关内容