Получение среднего значения в поле на основе переменной в другом поле

Почему вы используете цикл forвместо while?

while [[ -z $(lsof -i4TCP:8083 -sTCP:LISTEN -t) ]]
do
    echo "waiting for startup"
    sleep 1
done
5
22.02.2020, 00:40
4 ответа

Miller также удобен для таких задач, как напр.

$ mlr --nidx stats1 -a mean -f 3 -g 1 file.txt
a 2.500000
b 9.666667

или (с более поздней версией, в которой есть глагол format-values)

$ mlr --nidx stats1 -a mean -f 3 -g 1 then format-values -f '%.2f' file.txt
a 2.50
b 9.67
2
28.04.2021, 23:22

Вы недалеко. Попробуйте массивы, проиндексированные$1:

awk '{ total[$1] += $3; count[$1]++ } END {for (t in total) print t, total[t]/count[t]}' file
a 2.5
b 9.66667

Или, если вам нужно максимум два десятичных знака, как показано в вашем вопросе:

$ awk '{ total[$1] += $3; count[$1]++ } END {for (t in total) printf "%s %.2f\n", t, total[t]/count[t]}' file
a 2.50
b 9.67
7
28.04.2021, 23:22

С помощью GNUdatamash:

$ datamash -R2 -W -s -g 1 mean 3 <file
a       2.50
b       9.67

$ datamash -W -s -g 1 mean 3 <file
a       2.5
b       9.6666666666667
  • -R2округлить до двух знаков после запятой
  • -Wиспользуйте пробелы и/или табуляции в качестве разделителей полей
  • -sсортировать перед группировкой
  • -g 1группа на первом поле
  • mean 3среднее значение, третье поле

Вы можете удалить -W, если у вас есть табуляции в качестве разделителей, добавьте --output-delimiter=' ', если вы хотите заменить табуляцию символами пробела в выводе.

4
28.04.2021, 23:22
   #!/bin/bash
counta=`awk '$1 ~ /^a$/{print NR}' filename| awk 'END{print NR}'`
countb=`awk '$1 ~ /^b$/{print NR}' filename| awk 'END{print NR}'`

awk -v counta="$counta" '{if ($1 == "a"){sum=sum+$NF}}END{print "a" " " sum/counta}'  filename

awk -v countb="$countb" '{if ($1 == "b"){sum=sum+$NF}}END{print "b" " " sum/countb}'  filename

выход

a 2.5
b 9.66667
0
28.04.2021, 23:22

Теги

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