Для обработки статистических данных R обычно легче использовать.
Легче считать все данные в память. Awk не является самым большим языком для того (хотя это, конечно, возможно). Вот является недоброкачественная продукция сценарием Python.
#!/usr/bin/env python
import sys
n = int(sys.argv[1]) # the smooth parameter n must be passed as the first argument to the script
print sys.stdin.readline() # print the header line
def split_line(line): # split line into first 3 fields as string, then list of numbers
fields = line[:-1].split(";")
return [";".join(fields[:3])] + map(float, fields[3:7])
rows = map(split_line, sys.stdin.readlines())
def avg(i, j):
return (rows[i-n][j] + rows[i][j] + rows[i+n][j]) / 3
for i in xrange(n, len(rows) - n):
print ";".join([rows[i][0]] + [str(avg(i, j-2)) for j in xrange(3, 7)])
Если Ваши данные действительно огромны, вот сценарий, что я думаю, делает то, что Вы спрашиваете. Это читает 2*n+1 строки, хранит значения в prev[2*n]
через prev[1]
плюс $0
, затем печатает среднее число для (n+1) th строка.
awk -F ';' -v OFS=';' -v n="${1-1}" '
function avg(i) { return (prev[2*n, i] + prev[n, i] + $i) / 3; }
NR == 1 { print; next } # title line: print and skip the rest
NR >= 2*n+2 {
# fourth line on: print the average values from the past 3 lines
# with the labels from the previous line
print labels[n], avg(4), avg(5), avg(6), avg(7);
}
{
# shift the saved averages by 1 position
for (i=4; i<=7; i++) {
for (k=2*n; k>1; k--) prev[k, i] = prev[k-1, i];
prev[1, i] = $i;
}
# save the labels of this line to print in the next round
for (k=n; k>1; k--) labels[k] = labels[k-1];
labels[1] = $1 ";" $2 ";" $3;
}
'
Если это абсолютно важно, чтобы работать только по субботам, то сделайте это:
AnaCron
. Обратите внимание, что это также удаляет Ubuntu-Desktop
, но вам, вероятно, не понадобится на сервере. Это необходимо, потому что в противном случае невозможно контролировать, в какой день недели Anacron будет работать в /etc/cron.weekly
. Отредактируйте файл / etc / crontab
, он должен иметь следующую строку:
47 6 * * 7 Root Test -x / usr / sbin / anacron || (CD / && Run-Parts --report /etc/cron.weekly)
Измените 7
в 6
(суббота) и отрегулируйте первые два числа (минуты и час) в ваши потребности. Это вызвало все работы в /etc/cron.Weekly
, чтобы запустить в указанный день недели и часа.
/etc/cron.daily/apt
на /etc/cron.weekly/apt
. APT
файл
в /etc/cron.daily
включает в себя инструкции для этого:
# Create /etc/apt/apt.conf.d/02periodic file to set your preference.
....
#
# APT::Periodic::Unattended-Upgrade "0";
# - Run the "unattended-upgrade" security upgrade script
# every n-days (0=disabled)
# Requires the package "unattended-upgrades" and will write
# a log in /var/log/unattended-upgrades
Настройка
APT::Periodic::Unattended-Upgrade "7";
делает это проходить каждые семь дней, а также Если вы измените это в пятницу, первый Cron Daily Run будет в субботу утром (6:25 утра в соответствии с по умолчанию / etc / crontab
).
Если в то время машина находится в то время, скрипт будет работать в следующий день, когда система работает. И каждую неделю после этого (новый) день. Таким образом, вы получаете еженедельные обновления на машине, которая не всегда в данный день, но не то, что вы хотите.
Одна вещь, которую вы можете сделать при выходе из синхронизации, использует запись CRONTAB для запуска сенсорной команды, которая касается файла штампа / var / lib / apt / prientication / update-tamp
. Устанавливает его, чтобы сделать прошлой субботы ')