Інструмент командного рядка для обчислення базової статистики для потоку значень [закрито]


27

Чи є інструмент командного рядка, який приймає потік чисел (у форматі ascii) зі стандартного введення та дає основні описові статистичні дані для цього потоку, такі як min, max, середня, медіана, RMS, квантили тощо? Вихід може бути розбір наступною командою в ланцюжку командного рядка. Робоче середовище є Linux, але вітаються інші варіанти.


1
Я рекомендував би поглянути на | STAT . Це досить старе програмне забезпечення, але воно дуже зручно для таких речей. Також є pyp та кілька інших інструментів Un * x.
chl

@chl Посилання ISTAT зламана. Чи можете ви її оновити чи зробити відповідь?
Лео Леопольд Герц 준영

1
@Masi Yup, схоже, що сторінки більше не існує. Ось оновлене посилання .
chl

Відповіді:


22

Ви можете зробити це за допомогою R , що може бути трохи зайвим ...

EDIT 2: [OOPS, схоже, що хтось інший потрапив у 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

Я дуже рекомендую спочатку робити те, що ви хочете, в інтерактивному R, щоб переконатися, що команда правильна. Спробувавши це, я залишив дужки, що закриваються, і Rscript нічого не повертає - жодного повідомлення про помилку, жодного результату, просто нічого.

(Для запису, рядок файлів містить:

1
2
3
4
5
6

Отже, я повинен передувати свій потік цими Rкомандами?
mbaitoff

@mbaitoff: Так. Для мого тесту я створив файл, fooякий містив summary (as.numeric (readLines()))як його перший рядок, потім один числовий елемент даних на рядок для решти файлу. Це readLines()тільки читання від stdin (що є всім, що випливає, до кінця файлу).
Уейн

Схоже, ми серйозно дотримувались 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.
Skippy le Grand Gourou

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

Існує також проста-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 .

Відмова від відповідальності: Я автор ДПА .


1

На всякий випадок, є дані

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

проста програма для обчислення Linux простої статистики з командного рядка. Наприклад,

кішка file.dat | даних

виведе середнє значення для всіх рядків для кожного стовпця file.dat. Якщо вам потрібно знати стандартне відхилення, min, max, ви можете додати параметри --dev, --min та --max відповідно.

База даних має можливість агрегувати рядки на основі значення одного або декількох "ключових" стовпців.

Він написаний на C ++, працює швидко і з невеликим зайняттям пам’яті, і його можна чудово передати іншими інструментами, такими як вирізання, греп, sed, сортування, awk тощо.


1

Ви також можете скористатися клістами . Це дуже настроюваний інструмент інтерфейсу командного рядка для обчислення статистики для потоку обмежених вхідних чисел.

Параметри вводу / виводу

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

Параметри розбору

  • Виявлення на основі сигналу, в кінці файлу чи порожнього рядка для припинення обробки
  • Символ коментаря та роздільника можна встановити
  • Стовпці можна відфільтрувати з обробки
  • Рядки можна відфільтрувати з обробки на основі числових обмежень
  • Рядки можуть бути відфільтровані з обробки на основі обмеження рядка
  • Початкові рядки заголовка можна пропустити
  • Фіксовану кількість рядків можна обробити
  • Дублікати розмежувачів можна ігнорувати
  • Рядки можна переробити в стовпці
  • Суворо дотримуйтесь, що обробляються лише рядки одного розміру
  • Рядок, що містить заголовки стовпців, може використовуватися для виведення статистики виводу заголовків

Варіанти статистики

  • Підсумкова статистика (підрахунок, мінімум, середнє, максимальне, стандартне відхилення)
  • Коваріація
  • Кореляція
  • Найменше зміщення квадратів
  • Найменший нахил квадратів
  • Гістограма
  • Сирі дані після фільтрації

ПРИМІТКА: Я автор.


1

Інструмент Ya, який можна використовувати для обчислення статистики та перегляду розподілу в режимі ASCII, - міністр . Це інструмент від 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

x¯n=(n1)x¯n1+xnn
sn2=Snn1
Sn=Sn1+(xnx¯n1)(xnx¯n).

x¯0=S0=0


xiFLOAT_MAX-1.0xixi+1xixi1

Це насправді те, що роблять клістатори (детальну інформацію та інші функції див. У відповіді).
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 - повільніше, але, можливо, простіший варіант розрізання): http://moo.nac.uci.edu/~hjm/scut описано: http://moo.nac.uci.edu/~hjm/scut_cols_HOWTO. html


0

Ще один інструмент: tvv-підсумок з утиліти eBay TSV . Підтримує безліч основних підсумкових статистичних даних, таких як min, max, середня, медіана, кванти, стандартне відхилення, 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.