Hi,
Sorry RudiC, I really need a ksh version instead :(-
I've managed to insert the missing date string using sed and the script 'almost' works like how I want it with just a 'little' bit of problem. I will explain further as we get along.
The script now looks like below:
#!/bin/ksh
dates="dates"
date
echo ""
echo "- CONTENTS of $dates"
echo ""
cat ${dates}
echo ""
curr_month=`date '+%m`
curr_day=`date '+%d`
curr_year=`date '+%Y`
#curr_month=02
#curr_month=2016
#leap=${curr_year}; math=`echo "$leap%4" | bc`; [ ! -z $leap ] && [ $math -eq 0 ] && echo "$leap is a leap year!" || echo "$leap isn't a leap year";
leap=${curr_year}; math=`echo "$leap%4" | bc`; [ ! -z $leap ] && [ $math -eq 0 ] && leapyear="Y" || leapyear="N";
case "${curr_month}" in
01|03|05|07|08|10|12 )
max_days="31"
;;
04|06|09|11 )
max_days="30"
;;
02 )
case "${leapyear}" in
Y )
max_days=29
;;
N )
max_days=28
;;
esac
;;
esac
echo
echo "curr_month = ${curr_month}"
echo "curr_day = ${curr_day}"
echo "curr_year = ${curr_year}"
echo "leapyear = ${leapyear}"
echo "max_days = ${max_days}"
echo
check_day=${curr_day}
while [[ ${check_day} -le ${max_days} ]]
do
next_date="${curr_year}-${curr_month}-${check_day}"
if [[ -z "`grep ${next_date} ${dates}`" ]] ; then
let prev_day=${check_day}-1
prev_date="${curr_year}-${curr_month}-${prev_day}"
echo "- Missing date ---> ${next_date} ... INSERT THIS BEFORE ${prev_date}"
# --------------------------------------------------------------------
# - Unfortunately, if the ${prev_date} does not exist
# then the sed below fails too.
# So ideally, ${prev_date} should be checking for the last date
# previous to the current date
# --------------------------------------------------------------------
sed "
/${prev_date}/ a\\
${next_date}
" ${dates} > /tmp/dates.tmp
cp -p /tmp/dates.tmp ${dates}
fi
let check_day=${check_day}+1
done
The content of the dates file that I am checking is as below:
# e.g. 2014-10-01
2015-05-01
2015-05-04
2015-05-05
2015-05-06
2015-05-07
2015-05-08
2015-05-12
2015-05-14
2015-05-15
2015-05-18
2015-05-27
2015-06-02
2015-06-03
2015-06-04
2015-06-05
2015-06-06
2015-06-07
2015-06-08
2015-06-09
2015-06-10
2015-06-11
2015-06-12
2015-06-13
2015-06-14
2015-06-15
2015-06-18
2015-06-22
2015-06-23
2015-06-24
2015-06-26
2015-06-30
2015-07-01
The portion of the script that does the insert is as below:
while [[ ${check_day} -le ${max_days} ]]
do
next_date="${curr_year}-${curr_month}-${check_day}"
if [[ -z "`grep ${next_date} ${dates}`" ]] ; then
let prev_day=${check_day}-1
prev_date="${curr_year}-${curr_month}-${prev_day}"
echo "- Missing date ---> ${next_date} ... INSERT THIS BEFORE ${prev_date}"
# --------------------------------------------------------------------
# - Unfortunately, if the ${prev_date} does not exist
# then the sed below fails too.
# So ideally, ${prev_date} should be checking for the last date
# previous to the current date
# --------------------------------------------------------------------
sed "
/${prev_date}/ a\\
${next_date}
" ${dates} > /tmp/dates.tmp
cp -p /tmp/dates.tmp ${dates}
fi
let check_day=${check_day}+1
done
The problem is like this when I am running the script. Today is 2015-06-20 and 2015-06-20 is missing from the dates file.
Unfortunately, the sed portion that appends the missing date assumes that 2015-06-19 exists and unfortunately, that date string does not exist either, so the insert of 2015-06-20 fails.
So the 'logic' that I need to apply is if date-1 does not exist in the dates file, I need to check for the last known date string prior to the current date that I am checking and use that as the prev_date to insert the missing date from. In this case, prev_date should be 2015-06-18 instead.
Basically, I do not really what to insert all the missing date into the dates file, only the ones from current date when the script was run until the end day of the current month.
At the moment, I am writing that logic as deducting one day at a time, grepping the dates file until I find a previous date that match and then do the sed, a very tedious and long winding routine but works. Maybe someone know of a better way of doing this :o
Not sure if I've explained it clearly :o
---------- Post updated 06-20-15 at 02:45 AM ---------- Previous update was 06-19-15 at 01:23 PM ----------
Hi,
Now this is very, very, very embarrassing. After thinking about it, I don't actually have to check for previous date, all I have to actually do is append the missing dates into the dates file and then do a range sort of the file?
So, now my problem is how do I do a range sort of the file?
For example, for the file below, how do I sort the date string in it and keeping the comments in its place at the same time.
# Some comment
# More comment
# e.g. 2014-10-01
2015-05-01
2015-05-04
2015-05-05
2015-05-06
2015-05-07
2015-05-08
2015-05-12
2015-05-14
2015-05-15
2015-05-18
2015-05-27
2015-07-01
2015-06-20
2015-06-30
2015-06-21
The one below works but then I lose the comments?
cat dates | grep -v "^#" | sort