eikonal
eikonal

Reputation: 171

find match, print first occurrence and continue until the end of the file - awk

I have a pretty large file from which I'd like to extract only the first line of those containing my match and then continuing doing that until the end of the file. Example of input and desired output below

Input

C,4,2,5,6,8,9,5
C,4,5,4,5,4,43,6
S,4,23,567,2,4,5
S,23,4,7,78,8,9,6
S,3,5,67,8,54,56
S,4,8,9,54,3,4,52
E,2,3,213,5,8,44
E,5,7,9,67,89,33
E,54,526,54,43,53
S,9,8,9,7,9,32,4
S,5,6,4,5,67,87,88
S,4,23,5,8,5,7,3
E,4,6,4,8,9,32,23
E,43,7,1,78,9,8,65

Output

S,4,23,567,2,4,5
S,9,8,9,7,9,32,4

The match in my lines is S, which usually comes after a line that starts with either E or C. What I'm struggling with is to tell awk to print only the first line after those with E or C. Another way would be to print the first of the bunch of lines containing S. Any idea??

Upvotes: 0

Views: 1420

Answers (5)

Ed Morton
Ed Morton

Reputation: 203522

$ awk '/^S/{if (!f) print; f=1; next} {print; f=0}' file 
C,4,2,5,6,8,9,5
C,4,5,4,5,4,43,6
S,4,23,567,2,4,5
E,2,3,213,5,8,44
E,5,7,9,67,89,33
E,54,526,54,43,53
S,9,8,9,7,9,32,4
E,4,6,4,8,9,32,23
E,43,7,1,78,9,8,65

Upvotes: 0

karakfa
karakfa

Reputation: 67497

awk to the rescue!

$ awk '/^[CE]/{p=1} /^S/&&p{p=0;print}' file

S,4,23,567,2,4,5
S,9,8,9,7,9,32,4

Upvotes: 1

r.g
r.g

Reputation: 56

here's a multi liner to enter in a file (e.g. u.awk)

/^[CE]/ {ON=1; next}
/^S/ {if (ON) print}
{ON=0}

then run : "awk -f u.awk inputdatafile"

Upvotes: 1

hek2mgl
hek2mgl

Reputation: 157992

You can use sed, like this:

sed -rn '/^(E|C)/{:a;n;/^S/!ba;p}' file

Upvotes: 1

Kent
Kent

Reputation: 195059

does this one-liner help?

awk '/^S/&&!i{print;i=!i}!/^S/{i=!i}' file

or more "readable":

awk -v p=1 '/^S/&&p{print;p=0}!/^S/{p=1}' file

Upvotes: 4

Related Questions