[BASH] How to read multiple lines from a text file?
ProgrammingThis forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.
Welcome to LinuxQuestions.org, a friendly and active Linux Community.
You are currently viewing LQ as a guest. By joining our community you will have the ability to post topics, receive our newsletter, use the advanced search, subscribe to threads and access many other special features. Registration is quick, simple and absolutely free. Join our community today!
Note that registered members see fewer ads, and ContentLink is completely disabled once you log in.
p1array=( $(grep -A 12 "Person A" file) )
p2array=( $(grep -A 12 "Person B" file) )
This will give you a separate array for each person, with element 0 being the title line and 1-12 being the numbered entries. The IFS needs to be set to newline first though, in order to keep it from breaking at spaces; something I failed to note that in my first post. Or you can just shift the index numbers to account for the extra entry instead if you want.
Edit: For bash v4's mapfile, you can do this:
mapfile -t p1array < <(grep -A 12 "Person A" file)
mapfile -t p2array < <(grep -A 12 "Person B" file)
No need to futz around with IFS when using mapfile, but it seems you need to use -t to strip the newlines from the end of each line.
And thank you for your concern. But I'm half the country away from the quake and wasn't directly affected at all. The strength was only about a 4 here. In fact, I was on my bike at the time heading for a job and didn't notice a thing. I did feel the large aftershock 30 minutes later, however, which set everything rattling again for some time.
I'm sitting at home now watching the aftermath on the news and those tsunami images are scary stuff.
Last edited by David the H.; 03-11-2011 at 07:07 AM.
Reason: As stated
I am a bit confused. Sorry. I am quite new to programming and Bash. Ive had around 2 days worth of experience.
I am fairly average with arrays, and I have not heard of the IFS command..
Also, I maybe did not mention clearly that both the PersonA and PersonB would be in one text file..
Sorry if I have set confusion upon you !
IFS is the internal field separator environmental variable. It controls what characters bash views as "word" separators. It's set for space/tab/newline by default. But when you want it to ignore spaces, you can set it to newline only and it will break up the text based on lines instead.
And yes, I realized they're in the same file. That's why I used grep to grab each individual entry. the -A 12 option means that grep will output the matching string you give it, plus the 12 lines following it.
Usually awk needs some kind of input from a file or or stdin like this to work on, but another way to do it is to use a BEGIN command block to have it print arbitrary strings without input. The awk language has it's own separate variable system though, so to use it this way you have to first transfer your bash variables into the command using the -v option.
Of course, as grail demonstrated above, awk is a powerful scripting language of its own, and it can do everything you want without needing bash at all. When you have time, I recommend the awk tutorial here.
Finally, you can redirect the output of any of the above directly to a file as before, or you can capture the output of any command into a variable using $(..).