|
| Computing.Net: Over 1,000,000 posts about all things technology related! Over 90% answered within 24 hours! Click here to sign up now, it's free! |
Script using cal
|
Original Message
|
Name: Cnot_Man
Date: October 19, 2005 at 21:31:20 Pacific
Subject: Script using calOS: UNIXCPU/Ram: P4/512 |
Comment: I was wondering if there was an easy way to use cal with maybe either awk or sed to easily give the user the day of the week for the given day they entered (assuming the date was valid). Is that possible, or do I have to sit there and do all kinds of calculations to get the correct day? Thanks.
Report Offensive Message For Removal
|
|
Response Number 1
|
Name: Jim Boothe
Date: October 20, 2005 at 06:09:50 Pacific
|
Reply: (edit)I found a script I wrote (datestamped Apr 2002), that uses cal and awk to determine DOW. # !/bin/kshmmddyy=`echo $1 | tr "[/]" "[ ]"` echo $mmddyy | read mo day yr junk day=${day#0} cal $mo $yr | awk 'BEGIN { day="'$day'" split("Su Mo Tu We Th Fr Sa Su",DOW) getline getline} {if (col=index($0,day)) {dow=int((col+2)/3) print "DOW=" DOW[dow print "DOW=" DOW[dow] exit} }' exit 0 ./dow.sh 03/23/1947 DOW=Su
Report Offensive Follow Up For Removal
|
|
Response Number 2
|
Name: Jim Boothe
Date: October 20, 2005 at 06:14:02 Pacific
|
Reply: (edit)I had a little posting error. Here is the proper code: # !/bin/kshmmddyy=`echo $1 | tr "[/]" "[ ]"` echo $mmddyy | read mo day yr junk day=${day#0} cal $mo $yr | awk 'BEGIN { day="'$day'" split("Su Mo Tu We Th Fr Sa Su",DOW) getline getline} {if (col=index($0,day)) {dow=int((col+2)/3) print "DOW=" DOW[dow] exit} }' exit 0 ./datedow.sh 03/23/1947 DOW=Su
Report Offensive Follow Up For Removal
|
|
Response Number 3
|
Name: Cnot_Man
Date: October 20, 2005 at 14:06:15 Pacific
|
Reply: (edit)thanks for the post, quick question though, I am new to UNIX in general, and only know how to use bash. It looks as though that is for ksh. If it is not too much trouble, do you know what it would look like in bash. Thanks again.
Report Offensive Follow Up For Removal
|
|
Response Number 4
|
Name: Jim Boothe
Date: October 20, 2005 at 14:22:26 Pacific
|
Reply: (edit)On some linux servers, ksh is an alias for bash, so try it just like it is first. If it does not like the ksh, change ksh to bash and try that.
Report Offensive Follow Up For Removal
|
|
Response Number 5
|
Name: Cnot_Man
Date: October 20, 2005 at 16:09:23 Pacific
|
Reply: (edit)I tried it just as is, and with changing it to bash instead of ksh, and whenever it is run, it just goes back to the prompt, no result, nothing displayed, not even an error. Also, I am using sun solaris unix, not linux. Any ideas...? Thanks.
Report Offensive Follow Up For Removal
|
|
Response Number 6
|
Name: Cnot_Man
Date: October 20, 2005 at 16:15:35 Pacific
|
Reply: (edit)If I use sh datedow.sh 03/23/1947, then i get the error: "datedow.sh: bad substitution" and like I said, if i use just datedow.sh 03/23/1947 I get nothing.
Report Offensive Follow Up For Removal
|
|
Response Number 7
|
Name: nails
Date: October 20, 2005 at 23:01:23 Pacific
|
Reply: (edit)This is a shell implementation of Mike Keith's date algorithm: #!/bin/bash # This function returns the day of week where # 0 = sunday, 1 = monday, ... 6 = saturday # This algorithm is from Mike Keith's World of Words & Numbers: # http://users.aol.com/s6sj7gt/mikecal.htm # arguments: $1 = month, $2 = day, $3 = year in format YYYY get_dow() { # [.] means to truncate downward to the nearest integer # dayofweek=([23m/9] + d + 4 + y + [z/4] - [z/100] + [z/400] - 2 (if m >= 3)) mod 7 typeset -i DOW typeset -i z typeset -i multpr if [ $1 -lt 3 ] then # year determination z=$(($3-1)) else z=$3 fi if [ $1 -ge 3 ] then # set the multiplier multpr=2 else multpr=0 fi DOW=$(( ((23 * $1/9) + $2 + 4 + $3 + ($z/4) - ($z/100) + ($z/400) - $multpr) % 7)) echo $DOW } # return a day string # sunday, monday, .. saturday get_day_string() { case $1 in 0) echo "sunday";; 1) echo "monday";; 2) echo "tuesday";; 3) echo "wednesday";; 4) echo "thursday";; 5) echo "friday";; 6) echo "saturday";; *) echo "error";; esac } mydate="03/27/1947" set - $(IFS='/'; echo $mydate) TY=$3 TM=$1 TD=$2 day_str=$(get_day_string $(get_dow $TM $TD $TY) ) echo $day_str # should echo thursday
Report Offensive Follow Up For Removal
|
|
Response Number 8
|
Name: Jim Boothe
Date: October 21, 2005 at 06:56:12 Pacific
|
Reply: (edit)The problem is going to be with the day= command. I have to get any leading zero removed from the day portion of the date argument so that it will be an exact match against the day in the cal output which does not have leading zeros.In the code below, I now use an expr command to strip any leading zeros, so I think that should work for you. For testing only, I left the old command in also (as dayx), and I display values for dayx and day just to confirm what substitutions are being made. You can remove both of the lines that contain dayx. mmddyy=`echo $1 | tr "[/]" "[ ]"` echo $mmddyy | read mo day yr junk dayx=${day#0} day=`expr $day : "0*\(.*\)"` echo "TEST: dayx=$dayx day=$day"cal $mo $yr | awk 'BEGIN { day="'$day'" split("Su Mo Tu We Th Fr Sa Su",DOW) getline getline} {if (col=index($0,day)) {dow=int((col+2)/3) print "DOW=" DOW[dow] exit} }'
Report Offensive Follow Up For Removal
|

Post Locked
This post is quite old and has been locked from receiving new replies. Please create a new posting instead.
Go to Unix Forum Home
|
|
|