我们假设我的文件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
但是我如何获得下一行呢?
答案 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