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

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

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

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

sort | awk 'END{print NR}' 

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

Ответ 1

Эта программа 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

Ответ 2

С 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]; }'

Ответ 3

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