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
-~----------~----~----~----~------~----~------~--~---

Reply via email to