Your original code would have behaved identically to jeremiah's code. awk is
uniquely suited to this sort of line-by-line programmatic parsing:
#!/usr/bin/awk -f
BEGIN {
local=0
regional=0
company=1
}
/Company Total/ {
if (company == 1) {
regional = 1
company = 0
print $0
}
}
/Regional Total/ {
if (regional == 1) {
regional = 0
local = 1
print $0
}
}
/Local Total/ {
if (local == 1) {
local = 0
regional = 1
print $0
}
}
On Thu, Aug 20, 2009 at 11:17 PM, Jason Montoya <[email protected]> wrote:
> Thanks, Jeremiah, although wouldn't that return every item being grepped
> for, rather than the last one of each? Here's an example data set:
>
> Local Total: Bad
> Local Total: Bad
> Local Total: Bad
> Local Total: Good
> Regional Total: Bad
> Regional Total: Good
> Local Total: Bad
> Local Total: Bad
> Local Total: Good
> Regional Total: Bad
> Regional Total: Bad
> Regional Total: Good
> Company Total: Good
>
> So only the last of each set of totals should be returned since those are
> the only "good" ones.
>
> Maybe a better example of the code: (with elifs as suggested):
>
> #!/bin/bash
> local=0
> tac reportfile |
> {
> while read line; do
>
> if [[ $local = 1 && `echo $line | grep 'Local Total'` != "" ]]; then
> let local=0
> echo "$line"
> continue
> elif [[ $local = 0 && `echo $line | grep 'Regional Total'` != "" ]]; then
> let local=1
> echo "$line"
> continue
> elif [[ `echo $line | grep 'Company Total'` != "" ]]; then
> echo "$line"
> fi
>
> done
> }
>
> The idea is whenever a regional total is found, print it and then start
> looking for local totals. As soon as one is found, print it and stop
> looking for local totals.
>
> ------------------------------
> *From:* Jeremiah Bess <[email protected]>
> *To:* [email protected]
> *Sent:* Thursday, August 20, 2009 8:16:35 PM
> *Subject:* [lug:14947] Re: Parsing with bash
>
> Put the search lines into a single file, one per line. Then run this
> command:
>
> grep -f searchfile reportfile
>
> The -f will use each line in the "searchfile" as a grep pattern.
>
> If you want to keep the if statements (or for future reference) you should
> use an "else if" command. http://www.freeos.com/guides/lsst/ch03sec03.html
>
> Jeremiah E. Bess
> Network Ninja, Penguin Geek, Father of four
>
>
> On Thu, Aug 20, 2009 at 20:45, Jason Montoya <[email protected]> wrote:
>
>> I've been working on a way to parse a report file where there are several
>> hierarchies of data (say, company totals, regional totals, local totals) and
>> using a while read line loop with greps to identify the appropriate data.
>> It works, but it's *very* slow. Essentially it's in the form of
>>
>> tac reportfile |
>> {
>> while read line; do
>>
>> if [[ `echo $line | grep 'Company Total'` != "" ]]; then echo "$line"
>> fi
>>
>> if [[ `echo $line | grep 'Regional Total'` !="" ]]; then echo "$line"
>> fi
>>
>> if [[ `echo $line | grep 'Local Total'` != "" ]]; then echo "$line"
>> fi
>>
>> done
>> }
>>
>> The reason i do it this way is there are multiple of the lower totals and
>> I only want the last one in each. (there's logic for it but for simplicity
>> I'm not showing it here).
>>
>> I know I could learn perl or python or something and do it faster than all
>> these subshells to grep, but I'm interested to know if there is a faster way
>> to do this in bash?
>>
>>
>>
>>
>>
>
>
>
>
> >
>
--
Daniel
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Linux Users Group.
To post a message, send email to [email protected]
To unsubscribe, send email to [email protected]
For more options, visit our group at
http://groups.google.com/group/linuxusersgroup
-~----------~----~----~----~------~----~------~--~---