Вычислите среднее значение и стандартное значение по столбцу с помощью awk - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть этот файл:

Took:  15.473214149475098  seconds
Took:  12.94953465461731  seconds
Took:  2.235722780227661  seconds
Took:  40.53083419799805  seconds
Took:  21.840606212615967  seconds
Took:  35.777870893478394  seconds
Took:  13.153780221939087  seconds
Took:  2.966165781021118  seconds
Took:  35.54965615272522  seconds

Я бы хотел вычислить среднее и стандартное значения времени прямо в терминале.Может ли awk помочь?Я не очень знаком с этим.Я попытался разбить файл, чтобы получить столбец с числовыми значениями только таким образом: cat <filename> | awk -F "Took:" {print$2}, но он просто вернул все содержимое файла.

Ответы [ 5 ]

0 голосов
/ 14 декабря 2018

другой быстрый способ,

$ awk '{s+=$2; ss+=$2^2} END{print m=s/NR, sqrt(ss/NR-m^2)}' file

20.053 13.4924
0 голосов
/ 14 декабря 2018

Использование Perl однострочного

> cat dada.txt 
Took:  15.473214149475098  seconds
Took:  12.94953465461731  seconds
Took:  2.235722780227661  seconds
Took:  40.53083419799805  seconds
Took:  21.840606212615967  seconds
Took:  35.777870893478394  seconds
Took:  13.153780221939087  seconds
Took:  2.966165781021118  seconds
Took:  35.54965615272522  seconds
> perl -lane '$s+=$F[1];push(@a,$F[1]); END { $m=$s/@a; $sd+=($_-$m)**2 for(@a);$sd=sqrt($sd/@a); print "Mean:$m\nStandard Deviation:$sd"} ' dada.txt
Mean:20.0530427826775
Standard Deviation:13.4923983082523
> 
0 голосов
/ 14 декабря 2018
$ cat tst.awk
{ numbers[NR] = $2; sum += $2 }
END {
    mean = sum / length(numbers)
    # calculate std deviation
    for (i in numbers) {
        dif = numbers[i] - mean
        std += dif ^ 2
    }
    std = sqrt(std / length(numbers))

    print "Mean: " mean
    print "Standart Deviation: " std
}
$
$ awk -f tst.awk file
Mean: 20.053
Standart Deviation: 13.4924
0 голосов
/ 14 декабря 2018

На странице Википедии по стандартному отклонению есть интересный раздел, "Методы быстрого расчета" .Особый интерес представляет алгоритм Уэлфорда , который прост и численно стабилен:

A_0, Q_0 = 0, 0
for k in (1, ...):
    j = k-1
    A_k = A_j + (X_k-A_j)/k
    Q_k = Q_j + (X_k-A_j)*(X_k-A_k)

, где на каждом шаге A_k равен рабочемусреднее значение и Q_k связано с дисперсией населения σ² соотношением Q_k = σ²*k.

На этом теоретическом фоне мы можем написать

$ awk 'BEGIN{a=0;q=0}{x=$2;b=a+(x-a)/NR;q+=(x-a)*(x-b);a=b}END{print a,sqrt(q/NR)}' file
0 голосов
/ 14 декабря 2018

Не могли бы вы попробовать, чтобы получить среднее значение 2-го столбца.

awk '{sum+=$2;if($2){count++}} END{print sum/count}'  Input_file

РЕДАКТИРОВАТЬ:

awk '{if($2!=""){count++;sum+=$2};y+=$2^2} END{sq=sqrt(y/NR-(sum/NR)^2);sq=sq?sq:0;print "Mean = "sum/count ORS "S.D = ",sq}'  Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...