43 lines
3.4 KiB
Markdown
43 lines
3.4 KiB
Markdown
[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
|
|
|
|
|
|
|