Вычисление среднего значения в awk на основе состояния столбца в csv

Удаленный доступ к X-серверам в настоящее время обычно запрещен из-за серьезных проблем с безопасностью.

Либо брандмауэры, либо настройки X-сервера препятствуют успешному выполнению этих подключений.

Только локальные сокеты и сокеты домена Unix могут подключаться, таким образом, только localhost:server[.display] или вообще без хоста :server[.display] являются используемыми настройками.

Чтобы выяснить, прослушивает ли ваш X-сервер TCP-порт, вы можете запустить эту команду и посмотреть, отображается ли X-сервер (или ssh в случае туннелирования) с использованием портов в диапазоне 6000+:

$ sudo netstat -anp|grep -w LISTEN

Если ваш сервер прослушивает только связанные сокеты unix, которые будут отображаться с помощью lsof:

$ sudo lsof -p $(pgrep Xorg)

Эти строки представляют сокеты unix:

Xorg    1874 root   21u     unix 0xffff8800d5db4000      0t0      21169 @/tmp/.X11-unix/X0 type=STREAM

Чтобы идентифицировать все процессы, прослушивающие TCP-порт, вы можете запустить это команда:

$ sudo lsof -P | grep -w LISTEN

Например, вот демон ssh, прослушивающий TCP-порт 22:

sshd       1032              root    4u     IPv6              22727      0t0        TCP *:22 (LISTEN)
0
25.05.2017, 03:19
2 ответа

Проверьте это:

awk -F, '{date1[$4]+=$1;++date2[$4]}END{for (key in date1) print "Average of",key,"is",date1[key]/date2[key]}' file
Average of 27:May:2017 is 2677.57
Average of 26:May:2017 is 1410.02
Average of 25:May:2017 is 2940.02

Объяснение:

-F, : определяет разделитель . В качестве альтернативы может быть awk 'BEGIN{FS=","}...

Затем мы создаем два массива date1 и date2, в которых мы используем 4-е поле $4 в качестве индекса/ключа массива и первое поле $1 как значение, добавленное к существующему значению той же позиции массива.

Таким образом, для первой строки у нас будет

date1[27:May:2017]+=2415.02
++date2[27:May:2017] --> увеличивает значение на 1 - -> значение 1 для первой строки

Для следующей той же даты (строка 2) у нас будет

date1[27:May:2017]+=2415.02 + 3465.02
++date2[27:May:2017 ] --> увеличивает значение на 1 --> значение 2 (вторая строка)

Та же логика распространяется на все строки с одинаковой датой, а также на все разные даты.

В конце мы используем цикл for для перебора ключей массива date1 (или date2 — ключи одинаковы в обоих массивах = > $4) и для каждого найденного ключа мы печатаем ключ (=дата $4) и мы также печатаем дату1[ключ] value = сумма всех значений $1 для одной и той же даты $4, деленная на date2[key] value = числовое количество найденных строк с одинаковой датой = то же $4.

4
28.01.2020, 02:16

Вот вариант с использованием GNU datamash для усреднения:

datamash -t, groupby 4 mean 1 < file | 
  awk -F'[,:]' '{printf "Average for %dth %s is %f\n", $1,$2,$4}'
Average for 25th May is 2940.020000
Average for 26th May is 1410.020000
Average for 27th May is 2677.570000
2
28.01.2020, 02:16

Теги

Похожие вопросы