83 votes

utilitaire en ligne de commande pour imprimer les statistiques des nombres sous linux

Je me retrouve souvent avec un fichier qui comporte un numéro par ligne. Je finis par l'importer dans Excel pour visualiser des éléments tels que la médiane, l'écart-type, etc.

Existe-t-il un utilitaire en ligne de commande sous Linux pour faire la même chose ? J'ai généralement besoin de trouver la moyenne, la médiane, le minimum, le maximum et l'écart-type.

1 votes

Ceci est probablement pertinent : stackoverflow.com/questions/214363/ .

0 votes

Clôture du vote sur la base d'une récapitulation des outils. stats.stackexchange.com/questions/24934/ || serverfault.com/questions/548322/

0 votes

64voto

Matt Parker Points 7373

C'est un jeu d'enfant avec R. Pour un fichier qui ressemble à ceci :

1
2
3
4
5
6
7
8
9
10

Utilisez ceci :

R -q -e "x <- read.csv('nums.txt', header = F); summary(x); sd(x[ , 1])"

Pour l'obtenir :

       V1       
 Min.   : 1.00  
 1st Qu.: 3.25  
 Median : 5.50  
 Mean   : 5.50  
 3rd Qu.: 7.75  
 Max.   :10.00  
[1] 3.02765
  • En -q permet d'étouffer la licence de démarrage de R et la sortie de l'aide
  • En -e indique à R que vous allez passer une expression depuis le terminal
  • x est un data.frame - une table, essentiellement. Il s'agit d'une structure qui accueille plusieurs vecteurs/colonnes de données, ce qui est un peu particulier si vous ne lisez qu'un seul vecteur. Cela a un impact sur les fonctions que vous pouvez utiliser.
  • Certaines fonctions, comme summary() , s'accommoder naturellement data.frames . Si x avait plusieurs champs, summary() fournira les statistiques descriptives ci-dessus pour chacun d'entre eux.
  • Pero sd() ne peut prendre qu'un seul vecteur à la fois, c'est pourquoi j'indexe x pour cette commande ( x[ , 1] renvoie la première colonne de x ). Vous pouvez utiliser apply(x, MARGIN = 2, FUN = sd) pour obtenir les écarts types pour toutes les colonnes.

49voto

user2747481 Points 51

En utilisant "st" ( https://github.com/nferraz/st )

$ st numbers.txt
N    min   max   sum   mean  stddev
10   1     10    55    5.5   3.02765

Ou bien :

$ st numbers.txt --transpose
N      10
min    1
max    10
sum    55
mean   5.5
stddev 3.02765

(DISCLAIMER : j'ai écrit cet outil :))

1 votes

Des informations sur l'installation pour les débutants

3 votes

Si vous utilisez homebrew, l'installation est aussi simple que brew install st .

3 votes

Attention st peut également faire référence à simple terminal .

39voto

Pour la moyenne, la médiane et l'écart-type, vous pouvez utiliser awk . Cette méthode est généralement plus rapide que la méthode R solutions. Par exemple, la solution suivante imprimera la moyenne :

awk '{a+=$1} END{print a/NR}' myfile

( NR est un awk pour le nombre d'enregistrements, $1 signifie le premier argument (séparé par des espaces) de la ligne ( $0 serait la ligne entière, ce qui fonctionnerait également ici mais serait en principe moins sûr, bien que pour le calcul il ne prendrait probablement que le premier argument de toute façon) et END signifie que les commandes suivantes seront exécutées après avoir traité l'ensemble du fichier (on aurait pu aussi initialiser a a 0 dans un BEGIN{a=0} )).

Voici un exemple simple awk script qui fournit des statistiques plus détaillées (prend un fichier CSV en entrée, sinon changer). FS ) :

#!/usr/bin/awk -f

BEGIN {
    FS=",";
}
{
   a += $1;
   b[++i] = $1;
}
END {
    m = a/NR; # mean
    for (i in b)
    {
        d += (b[i]-m)^2;
        e += (b[i]-m)^3;
        f += (b[i]-m)^4;
    }
    va = d/NR; # variance
    sd = sqrt(va); # standard deviation
    sk = (e/NR)/sd^3; # skewness
    ku = (f/NR)/sd^4-3; # standardized kurtosis
    print "N,sum,mean,variance,std,SEM,skewness,kurtosis"
    print NR "," a "," m "," va "," sd "," sd/sqrt(NR) "," sk "," ku
}

Il est facile d'ajouter min/max à ce script, mais il est tout aussi facile d'ajouter le tuyau sort & head / tail  :

sort -n myfile | head -n1
sort -n myfile | tail -n1

26voto

dr. Points 198

Un autre outil qui pourrait être utilisé pour calculer des statistiques et visualiser la distribution en mode ASCII est le suivant ministat . Il s'agit d'un outil de FreeBSD, mais il est également disponible pour les distributions Linux populaires telles que Debian/Ubuntu. Vous pouvez également le télécharger et le compiler à partir de sources - il ne nécessite qu'un compilateur C et la bibliothèque standard C.

Exemple d'utilisation :

$ 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

19voto

bua Points 2673

Oui, cela s'appelle perl
et voici un one-liner concis :

perl -e 'use List::Util qw(max min sum); @a=();while(<>){$sqsum+=$_*$_; push(@a,$_)}; $n=@a;$s=sum(@a);$a=$s/@a;$m=max(@a);$mm=min(@a);$std=sqrt($sqsum/$n-($s/$n)*($s/$n));$mid=int @a/2;@srtd=sort @a;if(@a%2){$med=$srtd[$mid];}else{$med=($srtd[$mid-1]+$srtd[$mid])/2;};print "records:$n\nsum:$s\navg:$a\nstd:$std\nmed:$med\max:$m\min:$mm";'

Exemple

$ cat tt
1
3
4
5
6.5
7.
2
3
4

Et le commandement

cat tt | perl -e 'use List::Util qw(max min sum); @a=();while(<>){$sqsum+=$_*$_; push(@a,$_)}; $n=@a;$s=sum(@a);$a=$s/@a;$m=max(@a);$mm=min(@a);$std=sqrt($sqsum/$n-($s/$n)*($s/$n));$mid=int @a/2;@srtd=sort @a;if(@a%2){$med=$srtd[$mid];}else{$med=($srtd[$mid-1]+$srtd[$mid])/2;};print "records:$n\nsum:$s\navg:$a\nstd:$std\nmed:$med\max:$m\min:$mm";'
records:9
sum:35.5
avg:3.94444444444444
std:1.86256162380447
med:4
max:7.
min:1

23 votes

Je suis sûr que cela fonctionne, mais faire tout cela sur une seule ligne me fait saigner les yeux. Pourquoi ne pas créer un script, plutôt que cette atrocité ?

1 votes

Je viens du monde des langages fonctionnels (pas M$, ni java), tous les gens là-bas parlent comme ça :) personne n'est blessé ( discuss.joelonsoftware.com/default.asp?joel.3.263336.105 )

20 votes

Je suis presque sûr que "langages fonctionnels" != "écrire tout sur une seule ligne de la manière la plus concise possible".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X