Чтобы вернуться к 1 при достижении 800, вам придется пересчитать этот столбец как ((id - 1)% 799) + 1
, где %
- оператор модуля:
$ awk '/^\/\// { $6 = (($6 - 1) % 799) + 1; print }' file
//address: 9050004 data: 1 id: 1 len: 0 size: 2
//address: 9050008 data: 1 id: 2 len: 0 size: 2
//address: 902e004 data: 1 id: 3 len: 0 size: 2
//address: 902e008 data: 1 id: 799 len: 0 size: 2
//address: 9096004 data: 1 id: 1 len: 0 size: 2
//address: 9096008 data: 1 id: 2 len: 0 size: 2
//address: 9097004 data: 1 id: 3 len: 0 size: 2
//address: 902e008 data: 1 id: 1 len: 0 size: 2
//address: 9096004 data: 1 id: 2 len: 0 size: 2
//address: 9096008 data: 1 id: 3 len: 0 size: 2
//address: 9097004 data: 1 id: 4 len: 0 size: 2
Обратите внимание, что в ожидаемом выходе id
для адреса 902e008
равен 799. Это невозможно. если вы ограничиваете диапазон до [1, 799].
В crontab нельзя использовать секунды и отрицательное время. Просто подождите 59 секунд на 59-й минуте предыдущего часа. Пример crontab:
#
# minute 0-59
# hour 0-23
# dom 1-31
# mon 1-12 (or names)
# dow 0-7 (0 or 7 is Sun, or use names)
#
59 23,3,7,11,15,19 * * * sleep 59 && /bin/datadump
К сожалению, cron
больше предназначен для распознавания образов, чем для арифметических операций, поэтому что-то вроде -1 0/4 * * *
не сработает.
Вы можете просто указать каждый час вручную с помощью запятой, поэтому мы надеемся, что это должно дать желаемый результат:
59 59 3,7,11,15,19,23 * * *
Запуск за секунду до часа слишком доверяет вашей базе данных, хотя . Я бы лично дал ему еще несколько секунд, чтобы завершить (иначе он все равно сбросит завтрашние данные).