When scripting, we all work with variables, whether system ones or our own ones. Basically a variable is name that holds some value, it's like small storage which content can change during script execution.
An array is also variable, but it stores a set of values and values are accessed by their indexes. With AWK, the index can be number or string.
So there is shell script, that uses awk array. This is simple example of tracking working time, how many hours are spent on different activities in a month. Of course, the script can be improved to calculate time per whole year or any other idea, but I'll leave this to you.
The scripts uses input data from text file mytime.txt. the file looks like:
# Legend: # PRJ = Projects # IUS = Internal Users Support # EUS = External Users Support # HWT = Hardware Troubleshoot # SWT = Software Troubleshoot # RD = Research and Development # ------------------------------------------------------------------------------------------------------ # Year 2010 # January: Su M Tu W Th F Sa M Tu W T F Sa Su M Tu W Th F Sa Su M Tu W Th F Sa Su M Tu W # Task/Day: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 # ------------------------------------------------------------------------------------------------------ PRJ 0 4 8 2 1 5 0 8 2 1 5 4 0 0 1 5 4 8 2 0 0 4 8 2 1 5 0 0 2 1 3 IUS 0 2 0 2 3 1 0 0 2 3 1 2 0 0 3 1 2 0 2 0 0 2 0 2 3 1 0 0 2 3 3 EUS 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 1 HWT 0 1 0 1 1 1 0 0 1 1 1 1 0 0 1 1 1 0 1 0 0 1 0 1 1 1 0 0 1 1 0 SWT 0 1 0 2 1 0 0 0 2 1 0 1 0 0 1 0 1 0 2 0 0 1 0 2 1 0 0 0 2 1 0 RD 0 0 0 0 2 1 0 0 0 2 1 0 0 0 2 1 0 0 0 0 0 0 0 0 2 1 0 0 0 2 1 |
The script is time.sh
#!/bin/sh #set -x # variables FILE=mytime.txt # sed removes comments and empty lines # then pipe to (N)AWK section cat ${FILE} | sed '/^#/d' | sed '/^$/d' | \ # start nawk section nawk ' BEGIN { print print "Time spent this month: " print "-=-=-=-=-=-=-=-=-=-=-=-=" } # -- main start ----- { total=0 # go from second to last field for ( i=2; i<=NF; i++ ) # ... and add them to total total += $i # Assign total hours of tasks to array tasktotal # Number of Record (lines) increment, so it is index for array tasktotal[NR] = total # Assign first field (task name) to array taskname taskname[NR] = $1 # print task name, total and hours print $1, total, "hours" } # -- main end ------ END { # add all total hours and find how much working hours/month for (i=1; i<=NR; i++) monthtotal += tasktotal[i] print "--------------------------------------" print "Total work this month is " monthtotal " hours" print "--------------------------------------" # find working percentage of task for the month for (i=1; i<=NR; i++) taskperc[i] = tasktotal[i] * 100 / monthtotal print # print task name and percentage of that task in the month for (i=1; i<=NR; i++) print taskname[i] " : " taskperc[i] "%" # just comment - how to print whole array #printf "array is " #for (i=1; i<=NR; i++) # printf tasktotal[i] " " # print }' # nawk section finished exit 0 |
So once file mytime.txt is filled with working hours, just run the script time.sh and the output is below.
# ./time.sh Time spent this month: -=-=-=-=-=-=-=-=-=-=-=-= PRJ 86 hours IUS 40 hours EUS 6 hours HWT 18 hours SWT 19 hours RD 15 hours -------------------------------------- Total work this month is 184 hours -------------------------------------- PRJ : 46.7391% IUS : 21.7391% EUS : 3.26087% HWT : 9.78261% SWT : 10.3261% RD : 8.15217% |