Инструмент командной строки для расчета базовой статистики для потока значений [закрыто]


27

Существует ли какой-либо инструмент командной строки, который принимает поток чисел (в формате ascii) из стандартного ввода и предоставляет основную описательную статистику для этого потока, такую ​​как минимальное, максимальное, среднее, среднее, среднеквадратичное значение, квантили и т. Д.? Выходные данные могут быть проанализированы следующей командой в цепочке командной строки. Рабочая среда - Linux, но приветствуются и другие варианты.


1
Я бы порекомендовал взглянуть на | STAT . Это довольно старое программное обеспечение, но оно очень удобно для таких вещей. Также есть pyp и несколько других инструментов Un * x.
— ЧЛ

@chl Ссылка ISTAT не работает. Можете обновить или сделать ответ, пожалуйста?
— Лео Леопольд Герц 준영

1
@ Маси Да, похоже, страница больше не существует. Вот обновленная ссылка .
— ЧЛ

Ответы:


22

Вы можете сделать это с R , что может быть немного излишним ...

РЕДАКТИРОВАТЬ 2: [Упс, похоже, что кто-то еще ударил Rscript, когда я перепечатывал это.] Я нашел более простой способ. Установленный с R должен быть Rscript, который предназначен для того, что вы пытаетесь сделать. Например, если у меня есть файл barсо списком чисел, по одному на строку:

cat bar | Rscript -e 'summary (as.numeric (readLines ("stdin")))'

Передаст эти числа в R и запустит summaryкоманду R в строках, возвращая что-то вроде:

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00    2.25    3.50    3.50    4.75    6.00 

Вы также можете сделать что-то вроде:

script -e 'quantile (as.numeric (readLines ("stdin")), probs=c(0.025, 0.5, 0.975))'

чтобы получить квантили. И вы могли бы явно отрубить первую строку вывода (которая содержит метки) примерно так:

cat bar | Rscript -e 'summary (as.numeric (readLines ("stdin")))' | tail -n +2

Я настоятельно рекомендую сначала делать то, что вы хотите в Interactive R, чтобы убедиться, что вы правильно указали команду. При попытке этого я пропустил закрывающую скобку, и Rscript ничего не возвращает - ни сообщения об ошибке, ни результата, просто ничего.

(Для записи файловая строка содержит:

1
2
3
4
5
6

Итак, я должен добавить свой поток с этими Rкомандами?
— mbaitoff

@mbaitoff: да. Для моего теста я создал файл, fooкоторый содержал в summary (as.numeric (readLines()))качестве своей первой строки, а затем один числовой элемент данных на строку для остальной части файла. Это readLines()только чтение из стандартного ввода (что является всем, что следует, до конца файла).
— Уэйн

Похоже, мы серьезно придерживались Rобоих ответов, и это, кажется, огромный инструмент для крошечной задачи. Ну, ответы работают, но в любом случае, есть что-то еще, кроме R?
— mbaitoff

2
@mbaitoff: Вы можете использовать Python scipy, особенно если вы уже используете Python. Если вы используете / как Clojure (lisp, основанный на JVM, clojure.org ), на этом построена статистическая среда Incanter( incanter.org ). Вы также можете попробовать GNU Octave.
— Уэйн

21

Попробуйте "st":

$ seq 1 10 | st
N   min   max   sum   mean  stddev
10  1     10    55    5.5   3.02765

$ seq 1 10 | st --transpose
N       10
min     1
max     10
sum     55
mean    5.5
stddev  3.02765

Вы также можете увидеть пятизначную сводку:

$ seq 1 10 | st --summary
min  q1    median   q3    max
1    3.5   5.5      7.5   10

Вы можете скачать это здесь:

https://github.com/nferraz/st

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


Добро пожаловать на сайт, @ user2747481. Не могли бы вы немного уточнить этот ответ? Мы бы хотели, чтобы наши ответы были в основном независимыми. Поскольку вы новичок здесь, вы можете прочитать нашу страницу о нас , которая содержит информацию для новых пользователей.
— gung - Восстановить Монику

Благодарность! По состоянию на 2019 год stдоступен через Homebrewbrew install st
— Ноа Суссман

Остерегайтесь, что stтакже может ссылаться на simple terminal.
— Скиппи ле Гран Гуру

10

R предоставляет команду Rscript . Если у вас есть только несколько чисел, которые вы можете вставить в командную строку, используйте этот вкладыш:

Rscript -e 'summary(as.numeric(commandArgs(TRUE)))' 3 4 5 9 7

что приводит к

Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
3.0     4.0     5.0     5.6     7.0     9.0 

Если вы хотите читать из стандартного ввода, используйте это:

echo 3 4 5 9 7 | Rscript -e 'summary(as.numeric(read.table(file("stdin"))))'

Если число на стандартном входе разделено возвратом каретки (т. Е. По одному номеру в строке), используйте

Rscript -e 'summary(as.numeric(read.table(file("stdin"))[,1]))'

Можно создать псевдонимы для этих команд:

alias summary='Rscript -e "summary(as.numeric(read.table(file(\"stdin\"))[,1]))"'
du -s /usr/bin/* | cut -f1 | summary
Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
0.0     8.0    20.0    93.6    44.0  6528.0

+1: Извините, я только что нашел Rscript и отредактировал свой ответ, чтобы включить его, поэтому мы получили аналогичный ответ. Ваша read.tableидея - хороший способ обойтись по одному элементу в строке.
— Уэйн

Хорошо, спасибо за подтверждение и +1.
— Арно А

3

Datamash - еще один отличный вариант. Это из проекта GNU.

Если у вас есть homebrew / linuxbrew, вы можете сделать:

brew install datamash


2

Существует также simple-r, который может делать почти все, что может R, но с меньшим количеством нажатий клавиш:

https://code.google.com/p/simple-r/

Чтобы рассчитать базовую описательную статистику, нужно набрать одно из:

r summary file.txt
r summary - < file.txt
cat file.txt | r summary -

Не получает просто-R!


2

В этих комментариях также упоминается sta, разновидность c ++ для st.

Будучи написанным на C ++, он быстр и может обрабатывать большие наборы данных. Он прост в использовании, включает в себя выбор объективных или смещенных оценок и может выводить более подробную информацию, такую ​​как стандартная ошибка.

Вы можете скачать Sta на GitHub .

Отказ от ответственности: я автор sta .


1

На всякий случай, есть дата

https://sourceforge.net/p/datastat/code/

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

кошка file.dat | datastat

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

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

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


1

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

Варианты ввода / вывода

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

Варианты разбора

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

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

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

ПРИМЕЧАНИЕ: я автор.


1

Инструментом Ya, который можно использовать для расчета статистики и распределения представления в режиме 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

0

Икс¯Nзнак равно(N-1)Икс¯N-1+ИксNN
sN2знак равноSNN-1
SNзнак равноSN-1+(ИксN-Икс¯N-1)(ИксN-Икс¯N),

Икс¯0знак равноS0знак равно0


ИксяFLOAT_MAX-1.0Икся-Икся+1Икся-Икся-1

Это именно то, что делает Clistat (подробности и другие функции см. В ответе).
— dpmcmlxxvi

0

Наткнулся на эту старую ветку в поисках чего-то другого. Хотелось то же самое, не мог найти ничего простого, поэтому сделал это в perl, довольно тривиально, но использовал его несколько раз в день: http://moo.nac.uci.edu/~hjm/stats

пример:

 $ ls -l | scut -f=4 | stats                
Sum       9702066453
Number    501
Mean      19365402.1017964
Median    4451
Mode      4096  
NModes    15
Min       0
Max       2019645440
Range     2019645440
Variance  1.96315423371944e+16
Std_Dev   140112605.91822
SEM       6259769.58393047
Skew      10.2405932543676
Std_Skew  93.5768354979843
Kurtosis  117.69005473429

(scut медленнее, но, возможно, проще для версии cut): http://moo.nac.uci.edu/~hjm/scut описано: http://moo.nac.uci.edu/~hjm/scut_cols_HOWTO. HTML


0

Еще один инструмент: tsv-подводить итоги от eBay TSV Utilities . Поддерживает многие основные сводные статистические данные, такие как минимальная, максимальная, средняя, ​​медиана, квантили, стандартное отклонение, MAD и некоторые другие. Он предназначен для больших наборов данных и поддерживает несколько полей и группировку по ключу. Выход разделен табуляцией. Пример последовательности чисел от 1 до 1000, по одному на строку:

$ seq 1000 | tsv-summarize --min 1 --max 1 --median 1 --sum 1
1   1000    500.5   500500

Заголовки обычно генерируются из строки заголовка на входе. Если у входа нет заголовка, его можно добавить с помощью -wпереключателя:

$ seq 1000 | tsv-summarize -w --min 1 --max 1 --median 1 --sum 1
field1_min  field1_max  field1_median   field1_sum
1   1000    500.5   500500

Отказ от ответственности: я автор.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.