Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

Re: get n lines before or after a pattern

by Kenosis (Priest)
on Jul 25, 2012 at 17:09 UTC ( #983703=note: print w/ replies, xml ) Need Help??


in reply to get n lines before or after a pattern

Here's another option:

use Modern::Perl; my $searchFor = 'jack'; local $/ = 'id '; while (<DATA>) { next if !/\nname\s+\b$searchFor\b/; say 'id ', join "\n", ( split "\n" )[ 0, 1, 2, 5 ]; } __DATA__ start id 10 address Richmond name jack xxxxx aaaaa lastname black yyyy zzzzz id 11 address Central name rick cccccc dddddd lastname hanna eeeee yyyyy id 12 address denver name jack sssss tttttt lastname strong rrrrr mmmmm id 13 address Virginia name mick aaaaaaa ooooooo lastname jagger gggggg hhhhhh id 14 address Maine name rick sssss sssss lastname stewart ssssss ffffff end

Output:

id 10 address Richmond name jack lastname black id 12 address denver name jack lastname strong

Hope this helps!


Comment on Re: get n lines before or after a pattern
Select or Download Code
Re^2: get n lines before or after a pattern
by johngg (Abbot) on Jul 25, 2012 at 23:54 UTC

    Reading "records" rather than lines is a nice approach. One minor point, your local is not really local as you have not confined it to a particular scope so it applies from the point it appears until the end of the script.

    Rather than the split and array slice, another approach could be to open a file handle against a reference to the record so that you can read it line by line in an inner scope and just print the lines you want. This has the advantage that the record layout can change and it will still work.

    I hope this is of interest.

    Cheers,

    JohnGG

      This is of interest, and excellent, too, JohnGG!

      I was aware that I didn't confine the local $/; to a block, not thinking too much about the code snippet. However, I'll remember--as a best practice--to do so with future local (dynamically scoped) variables. It was good to point this out.

      I like your refined/seasoned coding: scoping, reading in a multi-line record, opening a file handle on the record-containing scalar, and then grepping through the lines to display the OP's desired output.

      Indeed, this is of interest, very well thought out, and very much appreciated.

      Thank you.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://983703]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others rifling through the Monastery: (12)
As of 2014-09-19 08:52 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (133 votes), past polls