Narzędzie wiersza polecenia do obliczania podstawowych statystyk dla strumienia wartości [zamknięte]


27

Czy jest jakieś narzędzie wiersza polecenia, które akceptuje przepływ liczb (w formacie ascii) ze standardowego wejścia i podaje podstawowe statystyki opisowe dla tego przepływu, takie jak min, maks, średnia, mediana, RMS, kwantyle itp.? Dane wyjściowe mogą być analizowane przez następne polecenie w łańcuchu poleceń. Środowiskiem roboczym jest Linux, ale inne opcje są mile widziane.


1
Poleciłbym rzucić okiem na | STAT . To dość stare oprogramowanie, ale jest bardzo wygodne dla takich rzeczy. Jest też pyp i kilka innych narzędzi Un * x.
chl

@chl Link ISTAT uszkodzony. Czy możesz go zaktualizować lub dać odpowiedź?
Léo Léopold Hertz -

1
@Masi Tak, wygląda na to, że strona już nie istnieje. Oto zaktualizowany link .
chl

Odpowiedzi:


22

Możesz to zrobić za pomocą R , co może być trochę przesada ...

EDYCJA 2: [OOPS, wygląda na to, że ktoś inny nacisnął Rscript, kiedy to pisałem.] Znalazłem łatwiejszy sposób. Zainstalowany z R powinien być Rscript, który ma robić to, co próbujesz zrobić. Na przykład, jeśli mam plik barz listą liczb, po jednym w wierszu:

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

Potokuje te liczby do R i uruchamia summarypolecenie R w wierszach, zwracając coś takiego:

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

Możesz także zrobić coś takiego:

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

zdobyć kwantyle. I oczywiście możesz odciąć pierwszy wiersz wyniku (który zawiera etykiety) za pomocą czegoś takiego:

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

Zdecydowanie poleciłbym najpierw zrobić to, co chcesz w interaktywnym R, aby upewnić się, że masz poprawne polecenie. Próbując tego, pominąłem nawias zamykający, a Rscript nic nie zwraca - brak komunikatu o błędzie, brak wyniku, po prostu nic.

(Dla rekordu pasek plików zawiera:

1
2
3
4
5
6

Więc powinienem uzupełnić swój przepływ tymi Rpoleceniami?
mbaitoff,

@mbaitoff: Tak. Dla mojego testu utworzyłem plik, fooktóry zawierał summary (as.numeric (readLines()))jako pierwszy wiersz, a następnie jeden element danych numerycznych na wiersz dla reszty pliku. Po readLines()prostu odczytuje ze standardowego wejścia (to wszystko, co następuje, do końca pliku).
Wayne

Wygląda na to, że poważnie utknęliśmy Rw obu odpowiedziach i wydaje się, że jest to ogromne narzędzie do drobnego zadania. Cóż, odpowiedzi działają, ale czy jest coś jeszcze oprócz R?
mbaitoff

2
@mbaitoff: Możesz używać Pythona scipy, zwłaszcza jeśli już używasz Pythona. Jeśli używasz / lubisz Clojure (lisp oparty na JVM, clojure.org ), zbudowane jest na nim środowisko statystyczne Incanter( incanter.org ). Możesz także spróbować gnu Octave.
Wayne

21

Spróbuj „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

Możesz również zobaczyć podsumowanie pięciu liczb:

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

Możesz go pobrać tutaj:

https://github.com/nferraz/st

(ZASTRZEŻENIE: Napisałem to narzędzie :))


Witamy na stronie, @ user2747481. Czy mógłbyś trochę rozwinąć tę odpowiedź? Chcielibyśmy, aby nasze odpowiedzi były w większości niezależne. Ponieważ jesteś tutaj nowy, możesz przeczytać naszą stronę o stronie , która zawiera informacje dla nowych użytkowników.
Gung - Przywróć Monikę

Dzięki! Od 2019 roku stjest dostępny przez Homebrewbrew install st
Noah Sussman

Uważaj, że stmoże również odnosić się do simple terminal.
Skippy le Grand Gourou

10

R udostępnia polecenie o nazwie Rscript . Jeśli masz tylko kilka liczb, które możesz wkleić w linii poleceń, użyj tego jednego linijki:

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

Co skutkuje w

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

Jeśli chcesz czytać ze standardowego wejścia, użyj tego:

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

Jeśli liczby na standardowym wejściu są oddzielone znakami powrotu karetki (tj. Jedna liczba na wiersz), użyj

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

Można utworzyć aliasy dla tych poleceń:

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: Przepraszam, że właśnie znalazłem Rscript i zredagowałem moją odpowiedź, aby to uwzględnić, więc otrzymaliśmy podobną odpowiedź. Twój read.tablepomysł to dobry sposób na obejście jednego elementu na linię.
Wayne

Ok, dziękuję za potwierdzenie i +1.
Arnaud A

3

datamash to kolejna świetna opcja. Pochodzi z projektu GNU.

Jeśli masz homebrew / linuxbrew, możesz:

brew install datamash


2

Istnieje również simple-r, który może zrobić prawie wszystko, co R, ale z mniejszą liczbą naciśnięć klawiszy:

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

Aby obliczyć podstawowe statystyki opisowe, należałoby wpisać jedną z:

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

Nie ma żadnego prostego-R!


2

Istnieje sta, który jest wariantem st ++ c ++, do którego również odwołuje się ten komentarz.

Napisany w c ++ jest szybki i może obsługiwać duże zbiory danych. Jest prosty w użyciu, obejmuje wybór obiektywnych lub stronniczych estymatorów i może generować bardziej szczegółowe informacje, takie jak błąd standardowy.

Możesz pobrać sta z github .

Uwaga: Jestem autorem Sta .


1

Na wszelki wypadek istnieje datastat

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

prosty program dla Linuksa obliczający proste statystyki z wiersza poleceń. Na przykład,

plik cat.dat | datastat

wyświetli średnią wartość we wszystkich wierszach dla każdej kolumny file.dat. Jeśli potrzebujesz znać odchylenie standardowe, min, max, możesz dodać odpowiednio opcje --dev, --min i --max.

datastat ma możliwość agregowania wierszy na podstawie wartości co najmniej jednej kolumny „kluczowej”.

Jest napisany w C ++, działa szybko i zajmuje niewiele pamięci, i może być ładnie połączony z innymi narzędziami, takimi jak cut, grep, sed, sort, awk itp.


1

Możesz również rozważyć użycie clistats . Jest to wysoce konfigurowalne narzędzie interfejsu wiersza poleceń do obliczania statystyk strumienia ograniczonych liczb wejściowych.

Opcje we / wy

  • Dane wejściowe mogą pochodzić z pliku, standardowego wejścia lub potoku
  • Dane wyjściowe można zapisać do pliku, standardowego wyjścia lub potoku
  • Dane wyjściowe używają nagłówków rozpoczynających się od „#”, aby umożliwić przesyłanie strumieniowe do gnuplot

Opcje analizy

  • Wykrywanie na podstawie sygnału, końca pliku lub pustej linii w celu zatrzymania przetwarzania
  • Można ustawić komentarz i znak ogranicznika
  • Kolumny można odfiltrować z przetwarzania
  • Wiersze można odfiltrować z przetwarzania na podstawie ograniczeń numerycznych
  • Wiersze można odfiltrować z przetwarzania na podstawie ograniczeń łańcuchowych
  • Początkowe wiersze nagłówka można pominąć
  • Można przetwarzać stałą liczbę wierszy
  • Zduplikowane ograniczniki można zignorować
  • Rzędy można przekształcić w kolumny
  • Ściśle wymuszaj przetwarzanie tylko wierszy o tym samym rozmiarze
  • Wiersz zawierający tytuły kolumn może służyć do tytułowania statystyk wyjściowych

Opcje statystyki

  • Statystyki podsumowujące (liczba, minimum, średnia, maksimum, odchylenie standardowe)
  • Kowariancja
  • Korelacja
  • Przesunięcie najmniejszych kwadratów
  • Najmniejsze nachylenie kwadratów
  • Histogram
  • Surowe dane po filtrowaniu

UWAGA: Jestem autorem.


1

Narzędziem, które można wykorzystać do obliczania statystyk i rozkładu widoków w trybie ASCII, jest ministat . Jest to narzędzie FreeBSD, ale jest ono również spakowane do popularnej dystrybucji Linuksa, takiej jak Debian / Ubuntu.

Przykład użycia:

$ 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

To właśnie robi clistats (zobacz odpowiedź po szczegóły i inne funkcje).
dpmcmlxxvi,

0

Natknąłem się na ten stary wątek, szukając czegoś innego. Chciałem tego samego, nie mogłem znaleźć niczego prostego, więc zrobiłem to w Perlu, dość trywialne, ale używaj go wiele razy dziennie: http://moo.nac.uci.edu/~hjm/stats

przykład:

 $ 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 jest wolniejszy, ale prawdopodobnie łatwiejszy do wersji cut): http://moo.nac.uci.edu/~hjm/scut opisany: http://moo.nac.uci.edu/~hjm/scut_cols_HOWTO. HTML


0

Inne narzędzie: tsv-podsumowanie z TSV Utilities na eBayu . Obsługuje wiele podstawowych statystyk podsumowujących, takich jak min, maks, średnia, mediana, kwantyle, odchylenie standardowe, MAD i kilka innych. Jest przeznaczony dla dużych zestawów danych i obsługuje wiele pól i grupowanie według klucza. Dane wyjściowe są oddzielone tabulatorami. Przykład sekwencji liczb od 1 do 1000, po jednej w wierszu:

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

Nagłówki są zwykle generowane z linii nagłówka na wejściu. Jeśli wejście nie ma nagłówka, można go dodać za pomocą -wprzełącznika:

$ 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

Oświadczenie: Jestem autorem.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.