2016-02-25 1 views
0

J'ai un script shell:Comment calculer l'écart-type dans mon script shell?

dir=$1 
cd $dir 
grep -P -o '(?<=<rating>).*' * | 
awk -F: '{A[$1]+=$2;L[$1]++;next}END 
{for(i in A){print i, A[i]/L[i]}}' | sort -nr -k2 | 
awk '{ sub(/.dat/, " "); print }' 

qui résume tous les numéros qui suivent le champ <rating> dans chaque fichier de mon dossier, mais maintenant je dois calculer l'écart type des chiffres plutôt que d'obtenir la moyenne . En additionnant la différence de chaque notation du fichier au carré moyen, puis en divisant ce résultat par la taille de l'échantillon -1. Je n'ai pas besoin de le faire dans tous les fichiers du dossier, mais dans deux fichiers spécifiques, hotel_188937.dat et hotel_203921.dat. Voici un exemple du contenu d'un de ces fichiers:

<Overall Rating> 
<Avg. Price>$155 
<URL> 

<Author>Jeter5 
<Content>I hope we're not disappointed! We enjoyed New Orleans... 
<Date>Dec 19, 2008 
<No. Reader>-1 
<No. Helpful>-1 
<rating>4 
<Value>-1 
<Rooms>3 
<Location>5 
<Cleanliness>3 
<Check in/front desk>5 
<Service>5 
<Business service>5 

<Author>... 
repeat fields again... 

La taille de l'échantillon du premier fichier est de 127 avec une moyenne de 4,78 par rapport à une taille d'échantillon de 324 et une moyenne de 4,78 pour le deuxième fichier . Y at-il de toute façon que je puisse modifier mon script pour calculer l'écart type pour ces deux fichiers spécifiques plutôt que de calculer la moyenne pour chaque fichier de mon répertoire? Merci pour votre temps.

+1

Découvrez http://stackoverflow.com/questions/18786073/compute-aviation-and-standard-deviation-with-awk – bartvanraaij

Répondre

2

Vous pouvez le faire en un seul script awk

$ awk -F'>' ' 
    $1=="<rating" {k=FILENAME;sub(/.dat/,"",k); 
        s[k]+=$2;ss[k]+=$2^2;c[k]++} 
       END{for(i in s) 
        print i,m=s[i]/c[i],sqrt(ss[i]/c[i]-m^2)}' r1.dat r2.dat 

r1 2.5 1.11803 
r2 3 1.41421 

s est pour somme, ss pour la somme des carrés, c pour le comptage , m pour moyenne. Notez que cela calcule l'écart-type de la population et non l'écart-type de l'échantillon. Pour ce dernier, vous devez faire quelques ajustements d'échelle avec (count-1).

1

Oui. Le * dans la ligne grep lui dit de rechercher dans tous les fichiers.

Modifier la ligne

grep -P -o '(?<=<rating>).*' * | 

à

grep -P -o '(?<=<rating>).*' hotel_188937.dat hotel_203921.dat |