Медиана столбца с awk - PullRequest
       37

Медиана столбца с awk

13 голосов
/ 29 мая 2011

Как я могу использовать AWK для вычисления медианы столбца числовых данных?

Я могу придумать простой алгоритм, но не могу его запрограммировать:

Что ядо сих пор это:

sort | awk 'END{print NR}' 

И это дает мне количество элементов в столбце.Я хотел бы использовать это, чтобы напечатать определенную строку (NR/2).Если NR/2 не является целым числом, то я округляю до ближайшего целого числа, и это медиана, в противном случае я беру среднее значение (NR/2)+1 и (NR/2)-1.

Ответы [ 5 ]

18 голосов
/ 29 мая 2011

Эта awk программа использует один столбец отсортированных по числовым данным данных:

#/usr/bin/env awk
{
    count[NR] = $1;
}
END {
    if (NR % 2) {
        print count[(NR + 1) / 2];
    } else {
        print (count[(NR / 2)] + count[(NR / 2) + 1]) / 2.0;
    }
}

Пример использования:

sort -n data_file | awk -f median.awk
16 голосов
/ 29 мая 2011

С awk вы должны сохранить значения в массиве и вычислить медиану в конце, предполагая, что мы смотрим на первый столбец:

sort -n file | awk ' { a[i++]=$1; } END { print a[int(i/2)]; }'

Конечно, для реального вычисления медианы выполните округление, как описано в вопросе:

sort -n file | awk ' { a[i++]=$1; }
    END { x=int((i+1)/2); if (x < (i+1)/2) print (a[x-1]+a[x])/2; else print a[x-1]; }'
1 голос
/ 13 марта 2018

ОК, только что увидел эту тему и подумал, что могу добавить свои два цента, так как я искал что-то подобное в прошлом. Хотя в заголовке написано awk, во всех ответах также используется sort. Вычисление медианы для столбца данных может быть легко выполнено с помощью datamash :

> seq 10 | datamash median 1
5.5

Обратите внимание, что sort не требуется, даже если у вас есть несортированный столбец:

> seq 10 | gshuf | datamash median 1
5.5

В документации приведены все функции, которые он может выполнять, а также хорошие примеры для файлов со многими столбцами. В любом случае, это не имеет ничего общего с awk, но я думаю, что datamash очень помогает в подобных случаях и может использоваться вместе с awk. Надеюсь, это кому-нибудь поможет!

1 голос
/ 13 марта 2018

Если у вас есть массив для вычисления медианы (содержит одну строку решения Johnsyweb):

array=(5 6 4 2 7 9 3 1 8) # numbers 1-9
IFS=$'\n'
median=$(awk '{arr[NR]=$1} END {if (NR%2==1) print arr[(NR+1)/2]; else print (arr[NR/2]+arr[NR/2+1])/2}' <<< sort <<< "${array[*]}")
unset IFS
1 голос
/ 14 апреля 2016

Этот ответ на основе AWK на аналогичный вопрос на unix.stackexchange.com дает те же результаты, что и Excel для вычисления медианы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...