Shell 四舍五入到最接近的5分钟

Shell 四舍五入到最接近的5分钟,shell,date,sed,awk,grep,Shell,Date,Sed,Awk,Grep,date命令返回当前日期。我要最近的5分钟间隔。例如 # date Thu Mar 15 16:06:42 IST 2012 在这种情况下,我想返回 Mar 15 16:05:00 在shell脚本中是否可能?或者这有没有一条班轮 更新: 日期的格式是 2012-03-10 12:59:59 最新更新: 以下命令按预期工作。谢谢你的回复 head r_SERVER_2012-03-10-12-55-00 | awk -F'^' '{print $7}' | awk '{split($2

date命令返回当前日期。我要最近的5分钟间隔。例如

# date
Thu Mar 15 16:06:42 IST 2012
在这种情况下,我想返回

Mar 15 16:05:00 
在shell脚本中是否可能?或者这有没有一条班轮

更新:

日期的格式是

2012-03-10 12:59:59
最新更新:

以下命令按预期工作。谢谢你的回复

head r_SERVER_2012-03-10-12-55-00 | awk -F'^' '{print $7}' |  awk '{split($2, a, ":"); printf "%s %s:%02d:00\n", $1, a[1],int(a[2]/5)*5}'
正确结果:

2012-03-10 12:55:00
但是我想显示除日期之外的其他字段。以下操作不起作用:

head r_SERVER_2012-03-10-12-55-00 | awk -F'^' '{print $1, $2, $7, $8}' |  awk '{split($2, a, ":"); printf "%s %s:%02d:00\n", $1, a[1],int(a[2]/5)*5}'
错误结果:

565 14718:00:00
应该是

565 123 2012-03-10 12:55:00 country

如果您有GNU AWK可用,您可以使用:

| gawk '{t=mktime(gensub(/[-:]/," ","g")); print strftime("%Y-%m-%d %H:%M:%S",int(t/5)*5);}'
这使用了
int()
函数,它截断,这意味着“向下舍入”。如果您决定选择“四舍五入”(即“最接近的”5秒增量),则将
int(t/5)
替换为
int((t+2.5)/5)

当然,如果你感到受虐狂,你可以在纯壳中这样做。这一个只截断而不是取整

[ghoti@pc ~]$ fmt="%Y-%m-%d %H:%M:%S"  
[ghoti@pc ~]$ date "+$fmt"
2012-03-15 07:53:37
[ghoti@pc ~]$ date "+$fmt" | while read date; do stamp="`date -jf \"$fmt\" \"$date\" '+%s'`"; date -r `dc -e "$stamp 5/ 5* p"` "+$fmt"; done
2012-03-15 07:53:35

请注意,我使用的是FreeBSD。如果您使用的是Linux,那么您可能需要为
date
命令使用不同的选项(特别是-r和-f选项)。我在bash中运行这个,但如果您需要纯Bourne shell,它应该可以工作。

如果您有GNU AWK可用,您可以使用这个:

| gawk '{t=mktime(gensub(/[-:]/," ","g")); print strftime("%Y-%m-%d %H:%M:%S",int(t/5)*5);}'
$ date="2012-03-10 12:59:59"
$ read d h m s < <(IFS=:; echo $date)
$ printf -v var "%s %s:%d:00" $d $h $(( m-(m%5) ))
$ echo "$var"
2012-03-10 12:55:00
这使用了
int()
函数,它截断,这意味着“向下舍入”。如果您决定选择“四舍五入”(即“最接近的”5秒增量),则将
int(t/5)
替换为
int((t+2.5)/5)

当然,如果你感到受虐狂,你可以在纯壳中这样做。这一个只截断而不是取整

[ghoti@pc ~]$ fmt="%Y-%m-%d %H:%M:%S"  
[ghoti@pc ~]$ date "+$fmt"
2012-03-15 07:53:37
[ghoti@pc ~]$ date "+$fmt" | while read date; do stamp="`date -jf \"$fmt\" \"$date\" '+%s'`"; date -r `dc -e "$stamp 5/ 5* p"` "+$fmt"; done
2012-03-15 07:53:35
请注意,我使用的是FreeBSD。如果您使用的是Linux,那么您可能需要为
date
命令使用不同的选项(特别是-r和-f选项)。我在bash中运行它,但如果您需要的话,它应该在纯Bourne shell中工作。

$date=“2012-03-10 12:59:59”
$ date="2012-03-10 12:59:59"
$ read d h m s < <(IFS=:; echo $date)
$ printf -v var "%s %s:%d:00" $d $h $(( m-(m%5) ))
$ echo "$var"
2012-03-10 12:55:00
$read d h m s<
$date=“2012-03-10 12:59:59”

$read d h m s<实际上日期是这种格式的。。。"2012-03-10 12:59:59". 问题中给出的格式只是一个例子。echo“2012-03-10 12:59:59”| awk'{split($2,a,“:”);printf“%s%s:%02d:00”,$1,a[1],int(a[2]/5)*5}尽管这样做很好,但它不会将事情汇总到第二天<代码>2012-03-10 23:59:59
应四舍五入至
2012-03-11 00:00;00
@ghoti,它的意思是向下取整。@ghoti,很抱歉看起来很粗鲁,但是“向下取整”(在标题中)也意味着“截断”,第二个示例似乎表明截断是所需的功能。实际上日期是这样的格式。。。"2012-03-10 12:59:59". 问题中给出的格式只是一个例子。echo“2012-03-10 12:59:59”| awk'{split($2,a,“:”);printf“%s%s:%02d:00”,$1,a[1],int(a[2]/5)*5}尽管这样做很好,但它不会将事情汇总到第二天<代码>2012-03-10 23:59:59
应四舍五入至
2012-03-11 00:00;00
@ghoti,它的意思是四舍五入。@ghoti,很抱歉看起来很粗鲁,但是“四舍五入”(在标题中)也意味着“截断”,第二个例子似乎表明截断是所需的功能。只是为了好玩,在PowerShell中:
获取日期(([long]((获取日期'2012-03-10 12:59:59')。ticks/3e9))*[long]3e9))
。停止向您的问题添加更多内容。我想你是想在聊天室里问这件事的,因为你似乎想就此展开讨论。为了好玩,在PowerShell中:
Get Date(([long]([Get Date'2012-03-10 12:59:59')。ticks/3e9]*[long]3e9))
。不要再给你的问题添加更多内容了。我想你是想在聊天室里问这件事,因为你似乎想就此展开讨论。