# 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 ```