我试图比较用户提供的日期和文件中的日期,这是一个文本文件,列出了许多日期和时间。
例如,用户会输入一个日期,如22/08/2007和1:00的时间,我需要脚本计算在用户提供的日期之后有多少个文本文件里的日期。
我通过将文本文件中的每个日期转换为Unix时间戳,然后进行比较来实现这一点。在bash中难道没有直接比较两个日期的方法吗?
谢谢您的帮助。
我试图比较用户提供的日期和文件中的日期,这是一个文本文件,列出了许多日期和时间。
例如,用户会输入一个日期,如22/08/2007和1:00的时间,我需要脚本计算在用户提供的日期之后有多少个文本文件里的日期。
我通过将文本文件中的每个日期转换为Unix时间戳,然后进行比较来实现这一点。在bash中难道没有直接比较两个日期的方法吗?
谢谢您的帮助。
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
}
它期望三个参数和stdin中的原始日期:
for D in $(seq 19 25) ; do echo $D/08/2007 ; done | ./count.sh 22 08 2007
3
它将持续工作直到2038年。;-)
dgrep -i '%d/%m/%Y %H:%M' '>=2007-08-22 01:00:00' < FILE | wc -l
在这里,FILE
是您的日期文件,-i
指定了文件中使用的日期格式(我假设这里的日期格式为22/08/2007 01:00
)。匹配的行将被打印出来,因此计数它们可以得到您想要的信息。
为什么不直接去掉单个数字,从最高位到最低位重新排列,将它们组合成一个新的大数,然后再进行比较呢? :) 假设在$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
01-01-2013
而且这样的日期是不被允许的
1-1-2013
干杯 :-)
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 #moving in directory where report are placed
for i in *.* #reading all the files present in directory and comparing with current sysdate
do
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 ]
then
echo "future cob file, check for the error"elif [ $sys_yyyy -gt $file_yyyy ]
then
echo "prev cob file , to be removed"
else
if [ $sys_mm -lt $file_mm ]
then
echo "future cob file, check for the error"
elif [ $sys_mm -gt $file_mm ]
then
echo "prev cob file , to be removed"
else
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