утилита командной строки для вывода статистики чисел в linux - PullRequest
61 голосов
/ 20 марта 2012

Я часто нахожу себя с файлом, который имеет один номер в строке. В итоге я импортирую его в Excel для просмотра таких вещей, как медиана, стандартное отклонение и т. Д.

Есть ли в linux утилита командной строки, которая делает то же самое? Мне обычно нужно найти среднее, среднее, минимальное, максимальное и стандартное отклонение.

Ответы [ 15 ]

52 голосов
/ 22 марта 2012

Это ветер с R. Для файла, который выглядит следующим образом:

1
2
3
4
5
6
7
8
9
10

Используйте это:

R -q -e "x <- read.csv('nums.txt', header = F); summary(x); sd(x[ , 1])"

Чтобы получить это:

       V1       
 Min.   : 1.00  
 1st Qu.: 3.25  
 Median : 5.50  
 Mean   : 5.50  
 3rd Qu.: 7.75  
 Max.   :10.00  
[1] 3.02765

Изменить, чтобы добавить пару поясняющих комментариев (потому что я вернулся к этому и не запомнил некоторые обоснования):

  • Флаг -q подавляет лицензирование при запуске R и вывод справки
  • Флаг -e сообщает R, что вы передадите выражение из терминала
  • x это, в основном, data.frame - таблица.Это структура, которая вмещает несколько векторов / столбцов данных, что немного странно, если вы просто читаете в одном векторе.Это влияет на то, какие функции вы можете использовать.
  • Некоторые функции, такие как summary(), естественным образом поддерживают data.frames.Если бы у x было несколько полей, summary() предоставил бы описанную выше описательную статистику для каждого.
  • Но sd() может принимать только один вектор за раз, поэтому я индексирую x для этой команды(x[ , 1] возвращает первый столбец x).Вы можете использовать apply(x, MARGIN = 2, FUN = sd), чтобы получить SD для всех столбцов.
35 голосов
/ 04 сентября 2013

Использование "st" (https://github.com/nferraz/st)

$ st numbers.txt
N    min   max   sum   mean  stddev
10   1     10    55    5.5   3.02765

Или:

$ st numbers.txt --transpose
N      10
min    1
max    10
sum    55
mean   5.5
stddev 3.02765

(ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я написал этот инструмент:))

33 голосов
/ 20 марта 2012

Для среднего, среднего и стандартного отклонения вы можете использовать awk. Как правило, это будет быстрее, чем R решения. Например, следующее напечатает среднее:

awk '{a+=$1} END{print a/NR}' myfile

(NR - это переменная awk для количества записей, $1 означает, что первый (разделенный пробелами) аргумент строки ($0 будет целой строкой, которая также будет работать здесь, но в принципе это было бы менее безопасно, хотя для вычислений в любом случае это, вероятно, просто принял бы первый аргумент), а END означает, что следующие команды будут выполнены после обработки всего файла (можно было бы также инициализировать a в 0 в BEGIN{a=0} заявлении)).

Вот простой awk скрипт, который предоставляет более подробную статистику (принимает CSV-файл в качестве входных данных, в противном случае изменяет FS):

#!/usr/bin/awk -f

BEGIN {
    FS=",";
}
{
   a += $1;
   b[++i] = $1;
}
END {
    m = a/NR; # mean
    for (i in b)
    {
        d += (b[i]-m)^2;
        e += (b[i]-m)^3;
        f += (b[i]-m)^4;
    }
    va = d/NR; # variance
    sd = sqrt(va); # standard deviation
    sk = (e/NR)/sd^3; # skewness
    ku = (f/NR)/sd^4-3; # standardized kurtosis
    print "N,sum,mean,variance,std,SEM,skewness,kurtosis"
    print NR "," a "," m "," va "," sd "," sd/sqrt(NR) "," sk "," ku
}

Это просто добавить мин / макс к этому сценарию, но так же просто передать sort & head / tail:

sort -n myfile | head -n1
sort -n myfile | tail -n1
19 голосов
/ 18 августа 2015

Y.a. Инструмент, который можно использовать для расчета статистики и распределения представлений в режиме ASCII: ministat . Это инструмент от FreeBSD, но он также упакован для популярного дистрибутива Linux, такого как Debian / Ubuntu.

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

$ cat test.log 
Handled 1000000 packets.Time elapsed: 7.575278
Handled 1000000 packets.Time elapsed: 7.569267
Handled 1000000 packets.Time elapsed: 7.540344
Handled 1000000 packets.Time elapsed: 7.547680
Handled 1000000 packets.Time elapsed: 7.692373
Handled 1000000 packets.Time elapsed: 7.390200
Handled 1000000 packets.Time elapsed: 7.391308
Handled 1000000 packets.Time elapsed: 7.388075

$ cat test.log| awk '{print $5}' | ministat -w 74
x <stdin>
+--------------------------------------------------------------------------+
| x                                                                        |
|xx                                   xx    x x                           x|
|   |__________________________A_______M_________________|                 |
+--------------------------------------------------------------------------+
    N           Min           Max        Median           Avg        Stddev
x   8      7.388075      7.692373       7.54768     7.5118156    0.11126122
14 голосов
/ 20 марта 2012

Да, это называется perl
и вот краткая однострочная:

perl -e 'use List::Util qw(max min sum); @a=();while(<>){$sqsum+=$_*$_; push(@a,$_)}; $n=@a;$s=sum(@a);$a=$s/@a;$m=max(@a);$mm=min(@a);$std=sqrt($sqsum/$n-($s/$n)*($s/$n));$mid=int @a/2;@srtd=sort @a;if(@a%2){$med=$srtd[$mid];}else{$med=($srtd[$mid-1]+$srtd[$mid])/2;};print "records:$n\nsum:$s\navg:$a\nstd:$std\nmed:$med\max:$m\min:$mm";'

Пример

$ cat tt
1
3
4
5
6.5
7.
2
3
4

И команда

cat tt | perl -e 'use List::Util qw(max min sum); @a=();while(<>){$sqsum+=$_*$_; push(@a,$_)}; $n=@a;$s=sum(@a);$a=$s/@a;$m=max(@a);$mm=min(@a);$std=sqrt($sqsum/$n-($s/$n)*($s/$n));$mid=int @a/2;@srtd=sort @a;if(@a%2){$med=$srtd[$mid];}else{$med=($srtd[$mid-1]+$srtd[$mid])/2;};print "records:$n\nsum:$s\navg:$a\nstd:$std\nmed:$med\max:$m\min:$mm";'
records:9
sum:35.5
avg:3.94444444444444
std:1.86256162380447
med:4
max:7.
min:1
11 голосов
/ 20 марта 2012

Среднее значение:

awk '{sum += $1} END {print "mean = " sum/NR}' filename

Медиана:

gawk -v max=128 '

    function median(c,v,    j) { 
       asort(v,j) 
       if (c % 2) return j[(c+1)/2]
       else return (j[c/2+1]+j[c/2])/2.0
    }

    { 
       count++
       values[count]=$1
       if (count >= max) { 
         print  median(count,values); count=0
       } 
    } 

    END { 
       print  "median = " median(count,values)
    }
    ' filename

Режим:

awk '{c[$1]++} END {for (i in count) {if (c[i]>max) {max=i}} print "mode = " max}' filename

В этом режиме расчета требуется четное количество выборок, но вы видите, как оно работает ...

Стандартное отклонение:

awk '{sum+=$1; sumsq+=$1*$1} END {print "stdev = " sqrt(sumsq/NR - (sum/NR)**2)}' filename
8 голосов
/ 06 мая 2014

data_hacks - это утилита командной строки Python для базовой статистики.

Первый пример с этой страницы дает желаемые результаты:

$ cat /tmp/data | histogram.py
# NumSamples = 29; Max = 10.00; Min = 1.00
# Mean = 4.379310; Variance = 5.131986; SD = 2.265389
# each * represents a count of 1
    1.0000 -     1.9000 [     1]: *
    1.9000 -     2.8000 [     5]: *****
    2.8000 -     3.7000 [     8]: ********
    3.7000 -     4.6000 [     3]: ***
    4.6000 -     5.5000 [     4]: ****
    5.5000 -     6.4000 [     2]: **
    6.4000 -     7.3000 [     3]: ***
    7.3000 -     8.2000 [     1]: *
    8.2000 -     9.1000 [     1]: *
    9.1000 -    10.0000 [     1]: *
7 голосов
/ 13 июля 2014

Вы можете также рассмотреть возможность использования clistats .Это легко настраиваемый инструмент интерфейса командной строки для вычисления статистики для потока входных номеров с разделителями.

Опции ввода / вывода

  • Входные данные могут быть из файла, стандартный ввод,или канал
  • Вывод может быть записан в файл, стандартный вывод или канал
  • В выводе используются заголовки, которые начинаются с "#", чтобы включить конвейер для gnuplot

Параметры синтаксического анализа

  • Обнаружение на основе сигнала, конца файла или пустой строки для остановки обработки
  • Можно установить символ комментария и разделителя
  • Столбцы могутбыть отфильтрованы от обработки
  • Строки могут быть отфильтрованы от обработки на основе числового ограничения
  • Строки могут быть отфильтрованы от обработки на основе ограничения строки
  • Исходные строки заголовка могут бытьпропущено
  • Можно обработать фиксированное количество строк
  • Дублирующие разделители можно игнорировать
  • Строки можно преобразовать в столбцы
  • Строго применять только эту строкуобрабатываются одинаковые размеры
  • Строка, содержащая заголовки столбцов, может использоваться для вывода статистики заголовков

Параметры статистики

  • Сводная статистика (Количество,Минимум, Среднее, Максимум, Стандартное отклонение)
  • Ковариация
  • Корреляция
  • Смещение наименьших квадратов
  • Наклон наименьших квадратов
  • Гистограмма
  • Необработанные данные после фильтрации

ПРИМЕЧАНИЕ. Я - автор.

7 голосов
/ 27 марта 2013

На всякий случай, есть datastat, простая программа для Linux, вычисляющая простую статистику из командной строки. Например,

cat file.dat | datastat

выведет среднее значение по всем строкам для каждого столбца file.dat. Если вам нужно знать стандартное отклонение, min, max, вы можете добавить опции --dev, --min и --max соответственно.

datastat имеет возможность агрегировать строки на основе значения одного или нескольких «ключевых» столбцов. Например,

cat file.dat | datastat -k 1

будет выдавать для каждого другого значения, найденного в первом столбце («ключ»), среднее значение всех других значений столбца, агрегированных по всем строкам с одинаковым значением в ключе. Вы можете использовать больше столбцов в качестве ключевых полей (например, -k 1-3, -k 2,4 и т. Д.).

Он написан на C ++, работает быстро и с небольшим объемом памяти, и его можно легко передать с помощью других инструментов, таких как cut, grep, sed, sort, awk и т. Д.

6 голосов
/ 07 февраля 2017

Я обнаружил, что хочу сделать это в конвейере оболочки, и получение всех правильных аргументов для R заняло некоторое время. Вот что я придумал:

seq 10 | R --slave -e 'x <- scan(file="stdin",quiet=TRUE); summary(x)' Min. 1st Qu. Median Mean 3rd Qu. Max. 1.00 3.25 5.50 5.50 7.75 10.00

Опция --slave "Сделать так, чтобы R выполнялись как можно тише ... Это подразумевает --quiet и --no-save." Опция -e указывает R обрабатывать следующая строка в виде кода R Первый оператор читает из стандартного в и сохраняет то, что читается в переменной с именем «x». Опция quiet=TRUE для функции scan подавляет запись строки, указывающей, сколько элементов было прочитано. Второе утверждение применяет функцию summary к x, которая производит вывод.

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