Ville Kivelä
Ville Kivelä

Reputation: 21

AWK print next line of match between matches

Let's presume I have file test.txt with following data:

.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

With AWK how would I print the lines after 10 and 20 between START and END. So the output would be.

100
2056
53
2345
45
875

I was able to get the lines with 10 and 20 with

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

but how would I get the next lines?

Upvotes: 0

Views: 364

Answers (3)

Ed Morton
Ed Morton

Reputation: 204721

Don't use ranges as they make trivial things slightly briefer but require a complete rewrite or duplicate conditions when things get even slightly more complicated.

Don't use getline unless it's an appropriate application and you have read and fully understand http://awk.info/?tip/getline.

Just let awk read your lines as designed:

$ 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

Feel free to use single-character variable names and cram it all onto one line if you find that useful:

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

Upvotes: 0

Jotne
Jotne

Reputation: 41460

Range in awk works fine, but is less flexible than using flags.

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

Upvotes: 1

Ville Kivelä
Ville Kivelä

Reputation: 21

I actually got what I wanted with

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

Upvotes: 2

Related Questions