[英]Compare a given date is last Business Day of a month using ShellScript
我的檔案有以下記錄; 我使用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
例如,在上述記錄集中,我必須跳過David和Rob,因為它們的Date值落在9月和10月的最后一個工作日。
假設星期六和星期日不是工作日,以下腳本將檢查日期並報告是否為該月的最后一個工作日:
#!/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
(星期幾,其中Sunday = 0)。
接下來,我們確定下一個工作日。 這是給定日期之后的1天,除非給定日期為星期五或星期六。 bash
數組days_to_add
用於確定距下一個工作日的天數。 然后,將許多天時間每天24小時乘以每小時60分鍾乘以每分鍾60秒添加seconds
來確定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
請注意,根據需要,David和Rob被跳過了。
date
實用程序可識別的date
格式取決於語言環境。 如果您使用的日期格式和您的語言環境不匹配,則必須執行某些操作。 假設我們有以下日期字符串:
datestring="30/01/2014"
可以使用awk
將其轉換為mm / dd / yyyy,如下所示:
datestring=$(echo "$datestring | awk -F/ -v OFS=/ '{print $2,$1,$3})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.