Я благодарен за предоставленный код user78605
, так как он помог мне найти медиану в моих запросах. Однако в вышеупомянутом коде не учитываются определенные условия, необходимые для правильного вычисления медианы.
«abc»
, «28b»
, «h2f»
, ""
и так далее). Ниже приводится мое расширение кода с учетом вышеупомянутых условий:
awk -F',' '
{col=$1}{if((col ~ /^-?[0-9]*([.][0-9]+)?$/) && ($0!=""))
{
sum+=col;
a[x++]=col;
b[col]++
if(b[col]>hf){hf=b[col]}
}
}
END{n = asort(a);idx=int((x+1)/2)
print "Mean: " sum/x
print "Median: " ((idx==(x+1)/2) ? a[idx] : (a[idx]+a[idx+1])/2)
for (i in b){if(b[i]==hf){(k=="") ? (k=i):(k=k FS i)}{FS=","}}
print "Mode: " k
}' file
Решение проблемы №1:
col = $ 1
# легче изменить столбцы, если хранится в переменной.
(col ~ /^-?[0-9 ]*([.pting[0-9 ]+)?$/)
# Строка должна содержать только цифры, точку (десятичный разделитель) или тире (знак минус). [Не учитывается только научное обозначение.]
($ 0! = "")
# вся строка не должна быть пустой.
В соответствующих строках выполните следующие операции цикла:
sum + = col
# (Сокращение отsum = sum + col
.) Сумма всех значений.
a [x ++] = col
# Каждое значение сохраняется в массиве.
b [col] ++
# Значения вcol
обрабатываются как суррогатные ключи массиваb
. Следовательно, вb
только столько элементов, сколько уникальных значений вcol
.Этот итератор создает массив значений частоты. (Сокращение отb [col] = b [col] +1
.)
if (b [col]> hf) {hf = b [col]}
#Lethf
означает «самая высокая частота». Переберите все частоты и обновитеhf
, только если будут обнаружены более высокие частоты.hf
изначально "" (ничего).
Решение проблемы №2:
После завершения операций цикла:
Отсортируйте значения, хранящиеся в массиве:
Это важно отметить, что исходные индексы массиваn = asort (a)
a
варьировались от «0» до «x-1». Помимо сортировки, новый диапазон индекса составляет от «1» до «x». Вот почему я используюint ((x + 1) / 2)
вместо
int ((x-1) / 2)
в качестве индекса, который содержит медиану - или меньшее из двух чисел, которые будут усреднены до медианы.
Решение проблемы №3:
((idx == (x + 1) / 2)? a [idx]: ( a [idx] + a [idx + 1]) / 2)
Это сокращенное обозначение конструкции if-else:
Ifint ((x + 1) / 2)
равно(x + 1) / 2
, тогда количество значений нечетное, а медиана будетa [idx]
. Если это не так,int ()
округлит(x + 1) / 2
в меньшую сторону до ближайшего целого числа, означающего, что количество значений четное. В этом случае среднее значениеa [idx]
иa [idx] +1
будет медианным.
Решение проблемы №4:
для (i in b) {if (b [i] == hf) {(k == "")? (k = i) :( k = k FS i)} {FS = ","}}
Посколькуhf
- это значение, которое представляет наивысшую частоту в наборе данных, если любое значение b равноhf
, его суррогатный ключ - это режим или, по крайней мере, один из режимов.
Этот код объединяет все суррогатные ключи,i
, которые соответствуют критерию, и сохраняет их в переменной,k
, который может быть напечатан в одной строке с заголовком «Режим».
-F
следует настроить в соответствии с тем, какой символ используется в качестве разделителя столбцов в файле.
Если в первой строке файла есть заголовки, добавьте NR> 1
перед {col = $ 1}
.
FS
использовалась для объединения двух переменных. Использование FS
особенно полезно, когда кто-то решает не использовать разделитель. То есть FS = ""
.
Следующие данные использовались для экспериментов с целью создания сценария:
10
20
10
20.5
50
30
40
50
10
30
20.5
-h
h
4.35
-537
0
-0
30
d
.
Mean: -13.2281
Median: 20.25
Mode: 10,30
Hay múltiples formas de lograr esto PM2 Puede usar PM2, que le permite crear un script de inicio para iniciar los reinicios esperados o inesperados de la máquina.
http://pm2.keymetrics.io/docs/usage/startup/
Docker Prefiero crear Dockerfile y ejecutarlo con --reiniciar = etiquetar siempre
Si desea continuar con su script de shell Luego use el crontab de Unix. Es muy fácil de usar y puede configurarlo en minutos
Edite crontab, ejecute lo siguiente reemplazando el "USUARIO" con el usuario de tiempo de ejecución deseado para el proceso del nodo. Si elige un usuario diferente que no sea usted mismo, deberá ejecutar esto con sudo.
$ crontab -u USUARIO -e
Una vez en el editor agregue la siguiente línea:
@reboot /usr/local/bin/forever start /your/path/to/your/index.js más
@reboot sh /su/ruta/hacia/su/startApp.sh
Guardar y confirmar que el archivo se guardó mediante el comando de verificación de #1 nuevamente
Nota :En mi opinión, debe usar la ruta completa en el archivo crontab para evitar problemas
Puede referir esta URL de referencia Manual de Ubuntu Cron