使用Shell脚本比较给定日期是一个月的最后一个工作日

时间:2014-10-12 22:15:57

标签: bash shell unix

我的文件有以下记录;我正在使用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月的最后一个工作日。十月

1 个答案:

答案 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}}