web-dev-qa-db-ja.com

Bashスクリプトは2つの日付変数を比較します

ユーザーが指定した日付をファイル内の日付と比較しようとしています。基本的には、多数の日付と時刻がリストされたテキストファイルです。

たとえば、ユーザーが22/08/2007などの日付と1:00の時刻を入力した場合、スクリプトが実行する必要があるのは、ユーザーが指定した日付より後のテキストファイルの日付の数を数えることです。

テキストファイルの各日付をUNIXタイムスタンプに変換し、その2つを比較することで、これを達成することができました。 bashで2つの日付を単純に比較する方法はありませんか?

前もって感謝します

20
Xleedos

GNU dateコマンドは、日付を1970年からの秒数に変換できます。次のスクリプトを試してください。

#! /bin/bash
DATE=$(date -d "$3-$2-$1 01" '+%s')
COUNT=0
tr '/' ' ' | {
    while read D M Y ; do
    THIS=$(date -d "$Y-$M-$D 01" '+%s')
    if (( THIS > DATE )) ; then
        COUNT=$((COUNT + 1))
    fi
    done
    echo $COUNT
}

3つの引数とstdinの生の日付が必要です。

for D in $(seq 19 25) ; do echo $D/08/2007 ; done | ./count.sh 22 08 2007
3

2038年まで機能します。;-)

19
ceving

外部のヘルパーツールが問題ない場合は、私の dateutils を参照してください。あなたのユースケースは

dgrep -i '%d/%m/%Y %H:%M' '>=2007-08-22 01:00:00' < FILE | wc -l

ここで、FILEは日付を含むファイルで、-iは、ファイルで使用される日付形式を指定します(私は22/08/2007 01:00 ここに)。一致する行が印刷されるので、それらを数えると、あなたが求めていた情報が得られます。

4
hroptatyr

...単純に1つの数値を切り取り、最も重要なものから重要度の低いものに並べ替えて、それらをまとめて新しい大きな数値を形成し、それから他の数値を比較しませんか? :)両方に日付があるとします$1および$2で、日付の形式がdd-mm-yyyy(時間と分の追加は簡単です):

d1=`echo "$1" | cut -d "-" -f 1`
m1=`echo "$1" | cut -d "-" -f 2`
y1=`echo "$1" | cut -d "-" -f 3`
date1="$y1$m1$d1"

d2=`echo "$2" | cut -d "-" -f 1`
m2=`echo "$2" | cut -d "-" -f 2`
y2=`echo "$2" | cut -d "-" -f 3`
date2="$y2$m2$d2"

if [ "$date1" -gt "$date2" ]; then
    #date1 > date2
else
    #date2 >= date1
fi

1桁のフィールドにはゼロが必要であることに注意してください。たとえば、次のような日付は機能します。

01-01-2013

このような日付はありません

1-1-2013

乾杯:-)

2
EdoardoSchnell

上記のコマンドは日付を整数形式で比較し、同じ年の日付を比較するまで正常に機能します。

より良いアイデアは、日付をdd、mm、yyyyの3つの部分に分割し、比較することです。以下のように:

sysdate = date +%d%m%Y sys_dd = echo $sysdate|cut -c1,2 sys_mm = echo $sysdate|cut -c3,4 sys_yyyy = echo $sysdate|cut -c5-8

cd $ dir_source#レポートが配置されるディレクトリに移動

for i in #ディレクトリに存在するすべてのファイルを読み取り、現在のsysdateと比較しますfilename = $ i filedate = echo $filename| cut -d '_' -f1 file_dd = echo $filedate|cut -c1,2 file_mm = echo $filedate|cut -c3,4 file_yyyy = echo $filedate|cut -c5-8

if [$ sys_yyyy -lt $ file_yyyy]の場合は「将来のcobファイルをエコーし​​、エラーを確認します」Elif [$ sys_yyyy -gt $ file_yyyy]の場合は「prev cob file、to be remove」をエコーし​​ますelse if [$ sys_mm -lt $ file_mm ]その後、「将来のcobファイル、エラーを確認する」をエコーし​​ます。

      if [ $sys_dd -lt $file_dd ]
      then
      echo "future cob file, check for the error"
      Elif [ $sys_dd -gt $file_dd ]
      then
      echo "prev cob file , to be removed"
      else
      echo "file date is same is cob date, retaining the file as it is"
      fi
 fi

fi

1
Amit Pareek

問題は、日付がstring-wise、 "1/1/2050 1:00" <"2/1/1999 0:00"のように出力されることです。そして、スクリプトがあなたがそう言わない限り何かが日時であることを知る方法はないので、あなたは本質的に任意の日付を可能な日付に変換する比較-最も重要な(年)が最初になるように要素を順序付ける必要があります(ISO日付など)、または数値に変換します。

1
l0b0