2016-03-15 53 views
0

對於這樣的文本文件之間的字符串出現次數:具有至少2 TAG1和4總線計數兩個圖案

START_PATTERN 

...TAG1... 
...TAG2... 
...TAG3... 
...TAG4... 
STOP_PATTERN 

START_PATTERN 
...TAG1... 
...TAG5... 
...TAG4... 
...TAG1... 
STOP_PATTERN 

我想回到第一塊(開始和結束之間)。 所以結果在這種情況下,簡直是:

START_PATTERN 
...TAG1... 
...TAG5... 
...TAG4... 
...TAG1... 
STOP_PATTERN 

我已經試過這樣:

awk 'x {next} 
     /START_PATTERN/ 
     {n=1;f=1;count=0}f {lines[n++]=$0} 
     /END_PATTERN/ 
     {if(n==4){/TAG1/count++;x=1}} #the message should appear for 9 lines 
     {print count}' file 

謝謝!

回答

1

你可以試試這個awk腳本:

/START/{ 
    p=1; tag=0; tot=0; 
    lines = ""; 
} 
p{ 
    if ($0 ~ /TAG/) 
     tot++; 
    if ($0 ~ /TAG1/) 
     tag++; 
    lines = lines RS $0 
} 
/STOP/{ 
    p=0; 
    if (tot == 4 && tag>=2) 
     print lines; 
} 
+0

是的,這就是我一直在尋找的!謝謝! –

1

另一個工作awk

awk '/START_PATTERN/ { 
    p=$0 
    lines=1 
    next 
} 
p != "" { 
    p = p ORS $0 
    lines++ 
} 
/STOP_PATTERN/ && split(p,a,"TAG1")>2 && lines>=4 { 
    print p 
}' file 

START_PATTERN 
...TAG1... 
...TAG5... 
...TAG4... 
...TAG1... 
STOP_PATTERN 
1

這可能會爲你工作(GNU SED):

sed -nr '/START/{:a;N;/STOP/!ba;/(TAG1).*\1/!b;/([^\n]*TAG[^\n]*\n){4,}/!b;p;q}' file 

打開SEDS的grep性質和收集STARTSTOP。如果收集的這些行包含兩個或更多個TAG1's,並且四個或更多個TAG行打印然後中止。