is there a way I can grep/awk multiple lines from a cluster based on a pattern?
I have a file as follows:
File.txt
JavaScript
x
>Cluster1
1 rabbit eats carrot
2 Lion is the king of jungle
3 Dogs loves toys
4 Cats loves mice
>Cluster2
1 Horse loves grass
2 Giraffes love leaves
3 Hippos love water
>Cluster3
1 Snakes love trees
2 Sharks love fish
3 Tigers love bushes
4 Cats love toys
5 Dogs love food
>Cluster4
1 Leopards love running
2 Dogs love toys
3 Cats love food
>Cluster5
1 rabbit eats carrot
2 Leopards love running
3 Cats love food
And the pattern is – “Dogs”, I would like the output to be:
JavaScript
>Cluster1
1 rabbit eats carrot
2 Lion is the king of jungle
3 Dogs loves toys
4 Cats loves mice
>Cluster3
1 Snakes love trees
2 Sharks love fish
3 Tigers love bushes
4 Cats love toys
5 Dogs love food
>Cluster4
1 Leopards love running
2 Dogs love toys
3 Cats love food
Is this possible?
Advertisement
Answer
JavaScript
perl -0777ne'print grep /bDogsb/, split /^(?=>)/m, $_' file
or
JavaScript
perl -ne'
sub p { print $buf if $buf =~ /bDogsb/; }
if (/^>/) { p(); $buf = ""; }
$buf .= $_;
END { p() }
' file
Notes:
- The first version loads the entire file into memory (but not the second).
- Both versions search the first line of the record as well as the subsequent lines.
- You can place the second program all on one line if you want.
- These address two bugs in karakfa’s answer:
- These don’t add a leading blank line if the first record doesn’t match.
- These don’t remove the final line feed if the last record doesn’t match.
- Related: Specifying file to process to Perl one-liner.