从 shell 层面进行简单的统计分析

从 shell 层面进行简单的统计分析

我正在寻找一些方便的程序/脚本,我可以通过 stdin 将数据泵入其中,并可以向我显示一些输入数据的基本统计数据。例如 - 提供一组由换行符分隔的值,我希望获得:

  • 所有值的平均值
  • 除 5% 最小值和 5% 最大值外的数据平均值
  • 标准差

是的 - 我知道,可以用 bash 或 awk 来完成,但也许你已经知道一些方便的东西?

附言:

我完全了解像八度、r 和其他一些“大炮” - 但我需要一些更简单的东西。

谢谢

答案1

这个小小的 AWK 片段将完成您所寻找的部分内容:

awk '{sum += $0; count++; vals[$0]++} END {mean = sum / count; print "Total: ", sum; print "Mean: ", mean; for (i in vals){ s += vals[i] * ((i - mean) ** 2) }; print "Standard Dev: ", sqrt(s/count)}' datafile

下降 5% 的部分会稍微复杂一些,取决于你具体的意思。

我知道您正在寻找一些现成的东西,但除了使用 R、Octave、SAS 或 SPSS 之外,我什么都不知道。

编辑:修正公式

答案2

您可以尝试类似的方法;

perl -e 'use List::Util qw(sum);while($r = <>){push (@array, $r)}; print sum(@array) / @array';

得到平均值。你可以安装 Statistics::Descriptive 包 http://search.cpan.org/~colink/Statistics-Descriptive-2.6/Descriptive.pm

满足其他要求所需的操作。stdev 可能很容易,另一个需要多几行进行排序和过滤。(毫无疑问可以在一行中完成...;-)

答案3

R 可能正是您要找的东西,也可能完全超出您的目的。从您的问题很难判断。

无论如何,看看吧http://en.wikipedia.org/wiki/R_(programming_language)

答案4

第一个和最后一个项目是可以做到的(我已经做过几次了),无需在内存中维护整个数据集,也无需提前知道项目总数。中间的项目(删除异常值)更具挑战性,需要在 RAM 中维护整个列表,或者至少提前知道项目总数。

我不知道有任何简单的预构建工具可以完成这些任务(尽管 Octave 和 R 听起来好像是这样的)。

相关内容