vwa0201@marst2 (Larry Baca) (03/22/91)
In one portion of a script I have written (csh), I need to keep a running total of certain fields within a record found by grep. My grep statement looks something like this: grep $pattern $infile | tee $outfile | cut -c49-100 | awk ...... My problem is in awk, I want to feed "awk" cols 49-100 of the greped record. The "cut" record consists of 5 numeric fields of 10, 12, 10, 10, and 10 cols in length, no spaces. I want awk to keep a running total for each field and spit the grand totals out at the end. As you can see I am also writing the entire record to $outfile. I would also like "awk" to make the grand totals available to the rest of the script. I might add the file I am working with is around 900K 100 col rcds, so maybe awk isn't the way to go. -- /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ LARRY BACA, marst2!lbaca DAASO-VWA AIS, DEFENSE AUTOMATIC ADDRESSING OFFICE, WESTERN DIVISION DDTC TRACY, TRACY CA. 95376-5057 AUTOVON 462-9391 COMERCIAL 832-9391
jik@athena.mit.edu (Jonathan I. Kamens) (03/22/91)
First of all, you don't have to use cut to pass awk the 49th through 100th
columns of the data; awk can figure out what to use itself. Second, awk is
capable of both splitting strings at specified columns (using substr) and of
keeping a running total. Something like this:
awk 'BEGIN {
column1 = column2 = column3 = column4 = column5 = 0;
}
{
column1 += substr($0,49,10);
column2 += substr($0,59,12);
column3 += substr($0,71,10);
column4 += substr($0,81,10);
column5 += substr($0,91,10);
}
END {
printf("%d %d %d %d %d\n", column1, column2, column3, column4, column5);
}'
--
Jonathan Kamens USnail:
MIT Project Athena 11 Ashford Terrace
jik@Athena.MIT.EDU Allston, MA 02134
Office: 617-253-8085 Home: 617-782-0710
P.S. By the way, both substr and the math capabilities of awk are among its
basic functions that are documented in the man page. If you needed to ask on
the net about them, I think perhaps you need to do a little bit more
documentation reading.]) (03/23/91)
In article <356@marst2> vwa0201@marst2 (Larry Baca) writes: >In one portion of a script I have written (csh), I need to keep a running total >of certain fields within a record found by grep. My grep statement looks >something like this: > >grep $pattern $infile | tee $outfile | cut -c49-100 | awk ...... > >My problem is in awk, I want to feed "awk" cols 49-100 of the greped record. > >The "cut" record consists of 5 numeric fields of 10, 12, 10, 10, and 10 cols >in length, no spaces. > >I want awk to keep a running total for each field and spit the grand totals >out at the end. As you can see I am also writing the entire record to $outfile. > >I would also like "awk" to make the grand totals available to the rest of >the script. > >I might add the file I am working with is around 900K 100 col rcds, so maybe >awk isn't the way to go. Well, I'd be approaching it like: -- getstuff.sh -- : # snag pattern $1 from file $2, write it to $3, and set the totals in # shell variables $1 through $5. pattern="$1" infile="$2" outfile="$3" # test values assigned above, then.... # # grep's still faster as our sieve that to ask awk to filter infile... # set -- `grep "$pattern" "$infile" | awk ' { print > outfile tot[1] += substr($0, 49, 10) tot[2] += substr($0, 59, 12) tot[3] += substr($0, 71, 10) tot[4] += substr($0, 81, 10) tot[5] += substr($0, 91, 10) } END { close(outfile) print tot[1]+0, tot[2]+0, tot[3]+0, tot[4]+0, tot[5]+0 }' \ outfile="$outfile" -` for i in 1 2 3 4 5 do eval "echo \"Total $i: \$$i\"" done -- getstuff.sh -- ...Kris -- Kristopher Stephens, | (408-746-6047) | krs@uts.amdahl.com | KC6DFS Amdahl Corporation | | | [The opinions expressed above are mine, solely, and do not ] [necessarily reflect the opinions or policies of Amdahl Corp. ]