对于这样的文本文件:
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
谢谢!
答案 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的性质,并收集START
和STOP
之间的行。如果收集的这些行包含两个或更多TAG1
个和四个或更多TAG
行打印然后中止。