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

时间:2015-02-05 08:20:23

标签: awk

我们假设我的文件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 

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

awk中的范围工作正常,但不如使用标记灵活。

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

答案 2 :(得分:0)

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

不要使用getline,除非它是一个合适的应用程序,并且您已阅读并完全理解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