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=(n−1)x¯n−1+xnn
sn2=Snn−1
Sn=Sn−1+(xn−x¯n−1)(xn−x¯n).

x¯0=S0=0


xiFLOAT_MAX-1.0xi−xi+1xi−xi−1

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.