[Source](http://c2.com/doc/expense/ "Permalink to ") # Expense Calculator _Ward Cunningham | ----- | | I wrote this calculator when I volunteered to work out the expenses for our 1981 ski trip to Jackson Hole. I wasn't even sure how to approach the calculation so I just started writing facts into a file. Pretty soon I realized that if I could just sum the groups and then bring those sums into other groups then I'd pretty much have it. I wrote a small AWK script to do just that and print a report. I finished the script and the report together. | input output | Jackson Hole Expenses February, '81 Cal Diller ... 71.25 Cowboy Steak House 24 M/M 26 Mexican 60 Lift Tickets 13.50 Pizza ------- CAL Bill Pooley ... 48 * 3 Lift Tickets 14.04 Breakfast 368.16 Room 29.31 Drinks ------- BILL Ward Cunningham ... 14.73 Gas 14.2 13.86 17 14.5 13.76 ------- GAS Total Gas 15 Blue Lion 48 Lift 30.55 Anthonys 69.24 Alpenhof GAS Total Gas ------- WARD Total Shared Expenses ... CAL Cal Diller BILL Bill Pooley WARD Ward Cunningham ------- TOTAL / 3 ------- SHARE Individual Share Individual Balances ... BILL Bill's Expenses SHARE DB ------- SUM 3.86 Telephone, Cal 6.01 Telephone, Ward ------- DB Due Bill CAL Cal's Expenses SHARE DB ------- SUM 3.86 DB Telephone ------- DC Due Cal WARD Ward's Expenses SHARE DB ------- SUM 6.01 DB Telephone ------- DW Due Ward Doublechecking ... DB DC DW ------- ERROR Unaccounted Funds Jackson Hole Expenses February, '81 Cal Diller ... 71.25 Cowboy Steak House 24.00 M/M 26.00 Mexican 60.00 Lift Tickets 13.50 Pizza ------- 194.75 Bill Pooley ... 48.00 * 3 Lift Tickets 14.04 Breakfast 368.16 Room 29.31 Drinks ------- 555.51 Ward Cunningham ... 14.73 Gas 14.20 13.86 17.00 14.50 13.76 ------- 88.05 Total Gas 15.00 Blue Lion 48.00 Lift 30.55 Anthonys 69.24 Alpenhof 88.05 Total Gas ------- 250.84 Total Shared Expenses ... 194.75 Cal Diller 555.51 Bill Pooley 250.84 Ward Cunningham ------- 1001.10 / 3 ------- 333.70 Individual Share Individual Balances ... 555.51 Bill's Expenses 333.70 DB ------- 221.81 3.86 Telephone, Cal 6.01 Telephone, Ward ------- 231.68 Due Bill 194.75 Cal's Expenses 333.70 DB ------- -138.95 3.86 DB Telephone ------- -142.81 Due Cal 250.84 Ward's Expenses 333.70 DB ------- -82.86 6.01 DB Telephone ------- -88.87 Due Ward Doublechecking ... 231.68 -142.81 -88.87 ------- 0.00 Unaccounted Funds | Here is the shell script that I used to do the calculations and write the report. It invokes AWK with the formatting program enclosed in quotes. The program keeps a running sum that it clears when it sees a blank line (NF==0). Other calculations are performed in place. The first occurrence of a variable name defines it as that sum. Subsequent occurrences become the stored value. | script | exec awk ' $1 ~ /^[A-Z]+[A-Z0-9]*$/ { if (sums[$1] == "" || $1 == "SUM") { sums[$1] = sum # Define Symbol $1 = sum sum = 0 } else { $1 = sums[$1] # Dereference Symbol } } ($1+0) != 0 {$1 = sprintf("%7.2f", $1)} # Pretty Print {print} $2 == "*" {$1 *= $3} # Explicit Calculations $2 == "/" {$1 /= $3} $2 == "DB" {$1 = -$1} $2 == "CR" {$1 = -$1} NF == 0 {sum = 0} # Implicit Summation {sum += $1} ' $1 © 2005