Assignment:
Given a file of expense entries of the following form :
,2014-01-06,Food,Aldis,26.76
3048,2014-01-06,Home,Bob's Heating,468
|
Set FS script before processing records. This is also a good place to set up an array of month names in chronological order. Look at split().
The 1st entry is a charge on a debit card and the second entry is for a written check. Individual fields are comma delimited.
1st field is either a number of or blank.
2nd field is date the date in the form yyyy-mm-dd.
3rd field is a general catagory of expense type such as Food or Utility.
4th field is who check is for.
5th is the amount. Write an awk script that reads the file ~berezin/Data/bank.data and accumulates various sums.
Your script should sum the amount paid by check and by debit separately. Do this by testing if field 1 is empty (debit) or has numbers in it (check).
Use an associative array to sum expenses on each catagory type. Use field 3, the expense catagory, as the key to select the array element and use field 5, the amount to be accumulated.
Also, provide a summery of monthly totals by testing field 2 for the month. The month is the middle 2 digits of field2, so -01- is January, -02- is February, etc. You may use either an associative or indexed array. But when you print out report, give month name.
See below about using substr and sprintf to cut just the month out of the date field and convert the string to a number.
Most if not all of the output will be done after all data is processed, so most of the print statements will appear in a END actoin block.
Tricks :
Use split to create an array of month names. If you do them in chronological order, they will be indexed in that order.
Use substr to parse out the "2 digit" month number. This will yield 01, 02, etc. which are strings and not nubmers whch is not exactly correct but close. If you cut carefully, you should get just the 2 digits.
Use sprintf to convert the convert the string number to a real number. sprintf works like printf except the output can be assigned to a variable rather than going to the screen.
num = sprintf( "%d", strnum );
If you take the substring you cut from the date field and run it through sprintf, you will get a real number which can be used to index the monthly cost accumulation.
You can now use a straight index from 1 to 12 to get both the month's name from the month name array and the costs for that month from the monthly cost array with the same index.
What your output should look like. Make it look nice, but you can change titles and spacing if you want.
Checks and debits
Checks : 9478.67
Debits : 9867.22
Expenses by catagory
Insurance 3285.00
Auto 219.23
Utility 5189.52
Health 455.02
Food 7492.91
Gas 110.27
Books 170.90
Computer 37.24
Utiity 157.76
Home 2228.04
Expenses by month
January 2749.11
February 1387.66
March 2054.58
April 1409.43
May 1269.69
June 2413.25
July 2091.96
August 2303.77
September 1269.73
October 1110.81
November 1085.27
December 200.63
|
If you want to try sorting the catagory section, feel free to do so. The class lecture section on predefine variables has an example on using asorti to work with an associative array's keys in ASCII order.