簡體   English   中英

使用ShellScript比較給定日期是一個月的最后一個工作日

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM