Взяв за основу код Брюса, вот более эффективная реализация
которая не хранит все данные в памяти.
Как указано в вопросе,
предполагается, что входной файл имеет (по крайней мере) одно число в строке.
Он подсчитывает строки во входном файле, которые содержат определяющее число
и передает это количество команде awk
вместе с (предшествующими) отсортированными данными.
Так, например, если файл содержит
6.0
4.2
8.3
9.5
1.7
то на вход команды awk
фактически поступает
5
1.7
4.2
6.0
8.3
9.5
Тогда сценарий awk
фиксирует счетчик данных в блоке кода NR==1
и сохраняет среднее значение
(или два средних значения, которые усредняются для получения медианы)
когда видит их.
FILENAME="Salaries.csv"
(awk 'BEGIN {c=0} $1 ~ /^[-0-9]*(\.[0-9]*)?$/ {c=c+1;} END {print c;}' "$FILENAME"; \
sort -n "$FILENAME") | awk '
BEGIN {
c = 0
sum = 0
med1_loc = 0
med2_loc = 0
med1_val = 0
med2_val = 0
min = 0
max = 0
}
NR==1 {
LINES = $1
# We check whether numlines is even or odd so that we keep only
# the locations in the array where the median might be.
if (LINES%2==0) {med1_loc = LINES/2-1; med2_loc = med1_loc+1;}
if (LINES%2!=0) {med1_loc = med2_loc = (LINES-1)/2;}
}
$1 ~ /^[-0-9]*(\.[0-9]*)?$/ && NR!=1 {
# setting min value
if (c==0) {min = $1;}
# middle two values in array
if (c==med1_loc) {med1_val = $1;}
if (c==med2_loc) {med2_val = $1;}
c++
sum += $1
max = $1
}
END {
ave = sum / c
median = (med1_val + med2_val ) / 2
print "sum:" sum
print "count:" c
print "mean:" ave
print "median:" median
print "min:" min
print "max:" max
}
'
Sus definiciones de servicio son así:
[Service]
ExecStart=python /home/pi/projects/script1.py
Restart=always
Y este es el mensaje de error en cada uno de ellos:
Executable path is not absolute, ignoring: python /home/pi/...
Para systemd
, el "ejecutable" en esta definición de servicio es python
, y claramente no es una ruta absoluta. El /home/pi/projects/script1.py
es solo un argumento para este python
ejecutable, y el trabajo del ejecutable es cuidar su forma adecuada.
Cualquier variable de entorno específica de Python -como PYTHONPATH
no tiene ningún significado parasystemd
:usted debe darle una ruta absoluta para el ejecutable en la definición del servicio, todas y cada una de las veces.
Por lo general, la ruta absoluta al intérprete de python es /usr/bin/python
, pero puede verificar:
$ type python
python is /usr/bin/python
Entonces sus definiciones de servicio deberían ser así:
[Service]
ExecStart=/usr/bin/python /home/pi/projects/script1.py
Restart=always
Puede encontrar una introducción muy útil a systemd aquí. Obtiene y mantiene un bot de Telegram ejecutándose como un script de Python.