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


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.