计算两个模式之间的字符串外观的数量

时间:2016-03-15 10:41:01

标签: regex awk sed

对于这样的文本文件:

START_PATTERN

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

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

我想返回第一个块(在开始和结束之间),至少有2个TAG1和4个总行。 因此,在这种情况下的结果将是:

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

谢谢!

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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

答案 2 :(得分:1)

这可能适合你(GNU sed):

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

启用类似grep的性质,并收集STARTSTOP之间的行。如果收集的这些行包含两个或更多TAG1个和四个或更多TAG行打印然后中止。