我的文件有以下记录;我正在使用Shell脚本 - While循环来读取这些文件。如果我遇到一个月的最后一个营业日期,我需要跳过它们。
Name date
David 09/30/2013
jack 10/01/2014
Mark 10/02/2014
John 10/13/2014
Daniel 10/30/2014
Rob 10/31/2014
例如,在上面的记录集中,我必须跳过大卫和Rob,考虑到他们的日期值是在9月的最后一个工作日。十月
答案 0 :(得分:1)
假设星期六和星期日不是工作日,以下脚本会检查日期并报告它是否是该月的最后一个工作日:
#!/bin/bash
days_to_add=(1 1 1 1 1 3 2)
seconds=$(date -d "$1" '+%s')
month1=$(date -d "@$seconds" '+%m')
day1=$(date -d "@$seconds" '+%w') # sun=0 sat=6
((seconds2=seconds + ${days_to_add[$day1]}*24*60*60))
month2=$(date -d "@$seconds2" '+%m')
[[ $month2 == $month1 ]] || echo "$1 is last business day of the month"
以下示例显示脚本没有输出,除非日期是该月的最后一个工作日:
$ bash script.sh 09/29/2013
$ bash script.sh 09/30/2013
09/30/2013 is last business day of the month
$ bash script.sh 10/30/2014
$ bash script.sh 10/31/2014
10/31/2014 is last business day of the month
$ bash script.sh 8/29/2014
8/29/2014 is last business day of the month
请注意,2014年8月29日不是一个月的最后一天,而是星期五,因此是该月的最后一个工作日。
这是在bash
下使用GNU date
测试的。
使用date
,命令行上提供的日期将转换为seconds
(自纪元以来的秒数),month1
(月份)和day
(星期日= 0的星期几)。
接下来,我们确定下一个工作日。这是指定日期后1天,除非给定日期是星期五或星期六。 bash
数组days_to_add
用于确定下一个工作日之前的天数。然后,添加seconds
每天24小时,每小时60分钟,每分钟60秒,seconds2
以确定month2
,这是下一个工作日的纪元以来的秒数。
最后,确定下一个工作日发生的月份month1
,并与给定日期的月份#!/bin/bash
days_to_add=(1 1 1 1 1 3 2)
not_last() {
seconds=$(date -d "$1" '+%s')
month1=$(date -d "@$seconds" '+%m')
day1=$(date -d "@$seconds" '+%w') # sun=0 sat=6
((seconds2=seconds + ${days_to_add[$day1]}*24*60*60))
month2=$(date -d "@$seconds2" '+%m')
[[ $month2 == $month1 ]]
}
while read name mmddyy
do
if [[ $mmddyy == date ]] || not_last "$mmddyy"
then
printf "%s\t%s\n" "$name" "$mmddyy"
fi
done <"$1"
进行比较。如果它们不同,则会打印一条消息。
这会循环输入文件,而日期是该月的最后一天的任何行:
input
如果您的示例输入位于名为$ bash script.sh input
Name date
jack 10/01/2014
Mark 10/02/2014
John 10/13/2014
Daniel 10/30/2014
的文件中:
date
请注意,根据需要,David和Rob被跳过了。
datestring="30/01/2014"
实用程序识别的日期格式取决于区域设置。如果您拥有的日期格式与您的区域设置不匹配,则必须执行某些操作。假设我们有这个日期字符串:
awk
可以使用datestring=$(echo "$datestring | awk -F/ -v OFS=/ '{print $2,$1,$3})
将其转换为mm / dd / yyyy,如下所示:
{{1}}