【问题标题】:How do I calculate the standard deviation in my shell script?如何计算我的 shell 脚本中的标准偏差?
【发布时间】:2016-02-25 13:01:49
【问题描述】:

我有一个 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 }'

它总结了我文件夹中每个文件中&lt;rating&gt; 字段后面的所有数字,但现在我需要计算数字的标准偏差而不是获取平均值。通过将文件中每个评级与均方的差异相加,然后将其除以样本大小 -1。我不需要在文件夹中的每个文件中执行此操作,而是在 2 个特定文件中执行此操作,hotel_188937.dathotel_203921.dat。以下是其中一个文件的内容示例:

<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...

第一个文件的样本大小为 127,平均值为 4.78,而第二个文件的样本大小为 324,平均值为 4.78。无论如何我可以改变我的脚本来计算这两个特定文件的标准偏差,而不是计算我目录中每个文件的平均值?感谢您的宝贵时间。

【问题讨论】:

标签: bash shell unix standard-deviation


【解决方案1】:

您可以在一个 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 表示求和,ss 表示平方和,c 表示计数,m 表示平均值。请注意,这计算的是总体标准偏差而不是样本标准偏差。对于后者,您需要使用 (count-1) 进行一些缩放调整。

【讨论】:

    【解决方案2】:

    是的。

    grep 行中的 * 告诉它搜索所有文件。

    换行

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多