繁体   English   中英

AWK打印比赛之间的下一场比赛

[英]AWK print next line of match between matches

假设我有以下数据的文件test.txt:

.0
41
0.0
42
0.0
43
0.0
44
0.0
45
0.0
46
0.0
START
90
34
17
34
10
100
20
2056
30
0.0
10
53
20
2345
30
0.0
10
45
20
875
30
0.0
END
0.0
48
0.0
49
0.0
140
0.0

使用AWK,我将如何在START和END之间打印10和20之后的行。 因此输出将是。

100
2056
53
2345
45
875

我能够用10和20得到线

awk '/START/,/END/ {if($0==10 || $0==20) print $0}' test.txt 

但是我将如何获得下一行?

我实际上得到了想要的东西

awk '/^START/,/^END/ {if($0==10 || $0==20) {getline; print} }' test.txt

awk range工作正常,但不如使用标志灵活。

awk '/^START/ {f=1} /^END/ {f=0} f && /^(1|2)0$/ {getline;print}' file
100
2056
53
2345
45
875

不要使用范围,因为它们会使琐碎的事情变得更简短,但是当事情变得更加复杂时,则需要完整的重写或重复条件。

除非它是一个合适的应用程序,并且您已经阅读并完全理解http://awk.info/?tip/getline,否则请不要使用它。

只要让awk按设计读取您的行即可:

$ cat tst.awk
/START/  { inBlock=1 }
/END/    { inBlock=0 }
foundTgt { print; foundTgt=0 }
inBlock && /^[12]0$/ { foundTgt=1 }

$ awk -f tst.awk file
100
2056
53
2345
45
875

如果发现有用,请随意使用单字符变量名并将其全部填充到一行中:

awk '/START/{b=1} /END/{b=0} f{print;f=0} b&&/^[12]0$/{f=1}' file

暂无
暂无

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

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