Finding the nth Particular Week in a Month – shell script
December6
I see lot of request posted in internet to find out the day of nth week in a Month.
example:
what is the date of 3rd Sunday in October
What is the date of 2nd Friday in June 2012
what is the date of 4th Saturday in January 2011..etc..
The below shell script is used to find out the days for the nth particular week in a month.
Try it out and shout if you find any issues… (Script is tested in bash shell. OS – linux(ubuntu))
For better readability http://paste.ubuntu.com/1412930/
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | #!/bin/bash ######################################################### # Script Name : finday.sh # # Author : Kamaraj Subramanian # # Website : www.thelinuxtips.com # # Bugs : Send it to kamaraj[at]thelinuxtips[dot].com # ######################################################### USAGE() { echo "----------------------------------------------------------------" echo "USAGE :: findday YEAR MONTH DAY WEEK" echo "Example :" echo "findday 2012 10 SU 3" echo "The above will tell the date of 3rd sunday in October 2012" echo "Valid values for YEAR ( 1 to 9999 )" echo "Valid values for MONTH ( 1 to 12 )" echo "Valid values for DAY ( SU, MO, TU, WE, TH, FR, SA )" echo "Valid values for WEEK ( 1 to 5 )" echo "----------------------------------------------------------------" exit 1 } YearCheck() { echo "$1" | grep -v "^[0-9]*$" >/dev/null 2>&1 && echo "Please enter the number 1 to 9999" && USAGE if [[ ! "${1}" -le "10000" || "${1}" -eq "0" ]] then echo "Enter the correct Year [1-9999]" USAGE fi } MonthCheck() { echo "$1" | grep -v "^[0-9]*$" >/dev/null 2>&1 && echo "Please enter the number 1 to 12" && USAGE if [[ ! "${1}" -le "12" || "${1}" -eq "0" ]] then echo "Enter the correct Month [1-12]" USAGE fi } DayCheck() { echo "$1" | egrep -v "^SU$|^MO$|^TU$|^WE$|^TH$|^FR$|^SA$" >/dev/null 2>&1 && echo "Valid values for DAY ( SU, MO, TU, WE, TH, FR, SA )" && USAGE [ "$1" == "SU" ] && WNO=7 && PNO=1 [ "$1" == "MO" ] && WNO=6 && PNO=2 [ "$1" == "TU" ] && WNO=5 && PNO=3 [ "$1" == "WE" ] && WNO=4 && PNO=4 [ "$1" == "TH" ] && WNO=3 && PNO=5 [ "$1" == "FR" ] && WNO=2 && PNO=6 [ "$1" == "SA" ] && WNO=1 && PNO=7 } WeekCheck() { if [[ ! "${1}" -le "5" || "${1}" -eq "0" ]] then echo "Enter the correct WEEK [1-5]" USAGE fi } if [ "$#" -ne "4" ] then USAGE else YearCheck $1 MonthCheck $2 DayCheck $3 WeekCheck $4 echo "---------------" echo "Given Inputs" echo "---------------" echo "YEAR :: $1" echo "MONTH :: $2" echo "DAY :: $3" echo "WEEK :: $4" echo "---------------" cal $2 $1 | awk -v n="$4" -v WNO="$WNO" -v PNO="$PNO" ' { if(NR==3) { if(NF==WNO) { a=2; } else { a=3; } } if(a && NR==(a+n)) { if(length($PNO)>0) { printf("Output Date : %s\n",$PNO); } else { printf("Requested week date is not available for the given month year combination\n"); } exit; } }' fi |
Output of the script
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 | $ ./findday.sh 2012 12 SA 5 --------------- Given Inputs --------------- YEAR :: 2012 MONTH :: 12 DAY :: SA WEEK :: 5 --------------- Output Date : 29 $ cal 12 2012 December 2012 Su Mo Tu We Th Fr Sa 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 $ ./findday.sh 2012 12 FR 5 --------------- Given Inputs --------------- YEAR :: 2012 MONTH :: 12 DAY :: FR WEEK :: 5 --------------- Requested week date is not available for the given month year combination |
Recent Comments