Usando "st" (https://github.com/nferraz/st)
$ st numbers.txt
N min max sum mean stddev
10 1 10 55 5.5 3.02765
Oppure:
$ st numbers.txt --transpose
N 10
min 1
max 10
sum 55
mean 5.5
stddev 3.02765
(DISCLAIMER:ho scritto io questo strumento :))
Per la media, la mediana e la deviazione standard puoi utilizzare awk
. Questo sarà generalmente più veloce di R
soluzioni. Ad esempio, quanto segue stamperà la media :
awk '{a+=$1} END{print a/NR}' myfile
(NR
è un awk
variabile per il numero di record, $1
indica il primo argomento (separato da spazi) della riga ($0
sarebbe l'intera riga, che funzionerebbe anche qui ma in linea di principio sarebbe meno sicura, anche se per il calcolo probabilmente prenderebbe comunque solo il primo argomento) e END
significa che i seguenti comandi verranno eseguiti dopo aver elaborato l'intero file (si potrebbe anche aver inizializzato a
a 0
in un BEGIN{a=0}
istruzione)).
Ecco un semplice awk
script che fornisce statistiche più dettagliate (prende un file CSV come input, altrimenti cambia 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
}
È semplice aggiungere min/max a questo script, ma è altrettanto facile reindirizzare sort
&head
/tail
:
sort -n myfile | head -n1
sort -n myfile | tail -n1
Questo è un gioco da ragazzi con R. Per un file simile a questo:
1
2
3
4
5
6
7
8
9
10
Usa questo:
R -q -e "x <- read.csv('nums.txt', header = F); summary(x); sd(x[ , 1])"
Per ottenere questo:
V1
Min. : 1.00
1st Qu.: 3.25
Median : 5.50
Mean : 5.50
3rd Qu.: 7.75
Max. :10.00
[1] 3.02765
- Il
-q
flag sopprime la licenza di avvio di R e l'output della guida - Il
-e
flag dice a R che passerai un'espressione dal terminale x
è undata.frame
- un tavolo, in pratica. È una struttura che ospita più vettori/colonne di dati, il che è un po' strano se stai solo leggendo in un singolo vettore. Ciò ha un impatto sulle funzioni che puoi utilizzare.- Alcune funzioni, come
summary()
, naturalmente ospitaredata.frames
. Sex
aveva più campi,summary()
fornirebbe le statistiche descrittive di cui sopra per ciascuno. - Ma
sd()
può accettare solo un vettore alla volta, motivo per cui indicox
per quel comando (x[ , 1]
restituisce la prima colonna dix
). Potresti usareapply(x, MARGIN = 2, FUN = sd)
per ottenere gli SD per tutte le colonne.