Округление до ближайших 5 минут - PullRequest
0 голосов
/ 15 марта 2012

Команда date возвращает текущую дату. Я хочу ближайший 5-минутный интервал. Например,

# date
Thu Mar 15 16:06:42 IST 2012

В этом случае я хочу вернуться ...

Mar 15 16:05:00 

Возможно ли это в скрипте оболочки? или для этого есть один лайнер?

Обновление:

дата в этом формате ...

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

Ответы [ 3 ]

2 голосов
/ 15 марта 2012
$ 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

Я использую подстановку процесса в команде чтения, чтобы изолировать изменения в IFS в подоболочке.`

2 голосов
/ 15 марта 2012
date | awk '{split($4, a, ":"); printf "%s %s %s:%02d:00", $2, $3, a[1],int(a[2]/5)*5}'
1 голос
/ 15 марта 2012

Если у вас есть 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, если это то, что вам нужно.

...