繁体   English   中英

awk在比赛上方打印3行,直到第二场比赛为止

[英]awk to print 3 lines above match until second match

我的行很长,我想选择性地在上面打印START + 3行,直到包括END。 问题是START和END之间的长度是可变的,但是我始终希望start上方的三行。
我尝试了awk:

awk '/START/,/END/' file.txt

但是,我找不到如何在START上方添加三行的方法。 任何提示,将不胜感激,谢谢!

输入

EFA  
DAD  
ABC  
DEF  
GEF  
START  
EDG  
EFG  
GAD  
END  
CDA  

结果

ABC  
DEF  
GEF  
START  
EDG  
EFG  
GAD  
END  
awk '/START/ { if (a) print a; if (b) print b; if (c) print c; }\
     { a=b; b=c; c=$0; }\
     /START/,/END/' file.txt

说明

/START/{if(a)print a;if(b)print b;if(c)print c}当遇到与/START/匹配的行时,将打印缓冲区记录,并跳过所有空记录。

{a=b;b=c;c=$0}移位缓冲区记录,如果需要的数量比数组可用的数量更多。

/START/,/END/打印/START//END/之间的所有记录

#!awk -f
{
  foo[NR] = $0
}
/START/ {
  bar = NR - 3
}
/END/ {
  while (bar++ <= NR)
    print foo[bar]
}
awk '/START/{print x3"\n"x2"\n"x;p=1}
     /END/{print;p=0}
     {x3=x2}
     {x2=x}
     {x=$0}p' your_file

测试:

> cat temp
EFA  
DAD  
ABC  
DEF  
GEF  
START  
EDG  
EFG  
GAD  
END  
CDA  
> awk '/START/{print x3"\n"x2"\n"x;p=1}/END/{print;p=0}{x3=x2}{x2=x}{x=$0}p' temp
ABC  
DEF  
GEF  
START  
EDG  
EFG  
GAD  
END  
> 

相同主题的相似但更容易理解的变化:

awk '/START/{for(i=1;i<4;++i)if(NR-i in a)print a[NR-i]}{a[NR]=$0;delete a[NR-3]}/START/,/END/' inputfile

在中间,它仅存储最后三行,如果有第四行则丢弃。 如果找到字符串START ,它将打印前三行(仅当它们存在时)以及STARTEND之间的任何内容。

如果STARTEND正确,则模式应为/^START$//^END$/或者代替模式匹配,在所有情况下都应使用直接字符串比较,如$0=="START"

输入文件:

GEF  
START  
EDG  
EFG  
GAD  
END  
CDA
EFA  
DAD  
ABC  
DEF  
GEF  
START  
EDG  
EFG  
GAD  
END  
CDA  

输出:

GEF  
START  
EDG  
EFG  
GAD  
END  
GEF  
DEF  
ABC  
START  
EDG  
EFG  
GAD  
END

一种对您的需求的可能解释的可能解决方案:

$ awk '{a[NR]=$0} /START/{s=NR} /END/{for (i=(s-3);i<=NR;i++) print a[i]}' file
ABC
DEF
GEF
START
EDG
EFG
GAD
END

如果有1个或多个START / END块并且您不希望第一个START到最后一个END,则可以使用。

如果START和END仅出现一次,则可以将grep与如下上下文一起使用:

grep -B 3 -A 99999 START file | grep -B 99999 END

即START before 3行,之后最多99999行,然后END之前最多99999行。

使用TAC

如果文件中有多个END / STARTS,则应该可以使用

tac file | awk '/END/{x=4}y&&x{x--}/START/{y=x}x' | tac

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM