我正在尝试将用户给出的日期与文件中的日期进行比较,基本上是列出了大量日期和时间的文本文件。
例如,用户将输入日期,例如22/08/2007和1:00的时间,我需要脚本做的是计算文本文件中的日期在用户给出的日期之后
我设法通过将文本文件中的每个日期转换为unix时间戳然后比较两者来实现此目的。有没有办法简单比较bash中的两个日期?
提前致谢
答案 0 :(得分:19)
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年。; - )
答案 1 :(得分:4)
如果您不介意使用外部帮助工具,请查看我的dateutils。
涵盖了您的用例dgrep -i '%d/%m/%Y %H:%M' '>=2007-08-22 01:00:00' < FILE | wc -l
其中FILE
是包含日期的文件,-i
指定文件中使用的日期格式(我假设日期类似22/08/2007 01:00
)。将打印匹配的行,因此计算它们将为您提供所需的信息。
答案 2 :(得分:2)
...为什么不简单地删除单个数字,将它们从最重要的数字重新排列到不太重要的数字,将它们组合成一个新的大数字然后比较另一个? :)假设您在$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
干杯: - )
答案 3 :(得分:1)
问题是日期的打印方式是字符串式,“1/1/2050 1:00”&lt; “2/1/1999 0:00”。而且由于脚本没有办法知道某些东西是日期时间而你没有这么说,你基本上有将任何日期转换为可以比较的东西 - 要么你必须订购元素以便最重要的(年份)是第一个,等等(如ISO日期)或转换为数字。
答案 4 :(得分:1)
上面的命令以整数形式比较日期,并且在你比较同年的日期之前可以正常工作。
更好的想法是将日期分为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 #moving在放置报告的目录中
for i in 。 #reading目录中存在的所有文件,并与当前的sysdate进行比较
做
文件名= $ 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] 然后 echo&#34;将来的cob文件,检查错误&#34; elif [$ sys_yyyy -gt $ file_yyyy] 然后 echo&#34; prev cob文件,将被删除&#34; 其他 如果[$ sys_mm -lt $ file_mm] 然后 echo&#34;将来的cob文件,检查错误&#34; elif [$ sys_mm -gt $ file_mm] 然后 echo&#34; prev cob文件,将被删除&#34; 其他
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
网络连接