用于计算值流的基本统计信息的命令行工具


27

是否有任何命令行工具可以接受来自标准输入的数字流(以ascii格式),并提供该流的基本描述性统计信息,例如最小值,最大值,平均值,中位数,RMS,分位数等?欢迎输出可被命令行链中的下一个命令解析。工作环境是Linux,但是欢迎使用其他选项。


1
我建议看一下| STAT。那是一个很老的软件,但是对于这样的事情非常方便。还有pyp其他几个 Un * x工具。
chl 2013年

@chl链接ISTAT损坏。可以更新它还是作为答案?
莱奥列奥波尔德赫兹준 영

1
@Masi是,该页面似乎已不存在。这是更新的链接
chl 2015年

Answers:


22

您可以使用R来做到这一点,这可能有点过分...

编辑2:[哎呀,当我重新输入代码时,看起来就像其他人打了Rscript。]我找到了一种更简单的方法。与R一起安装的应该是Rscript,这意味着可以执行您想做的事情。例如,如果我有一个包含bar数字列表的文件,则每行一个:

cat bar | Rscript -e 'summary (as.numeric (readLines ("stdin")))'

将这些数字输入R并在行上运行R的summary命令,返回类似以下内容:

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00    2.25    3.50    3.50    4.75    6.00 

您还可以执行以下操作:

script -e 'quantile (as.numeric (readLines ("stdin")), probs=c(0.025, 0.5, 0.975))'

获得分位数。很明显,您可以使用类似以下内容截断输出的第一行(包含标签):

cat bar | Rscript -e 'summary (as.numeric (readLines ("stdin")))' | tail -n +2

我强烈建议您首先在交互式R中做您想做的事情,以确保命令正确。在尝试此操作时,我省略了右括号,Rscript不返回任何内容-没有错误消息,没有结果,仅没有任何结果。

(作为记录,文件栏包含:

1
2
3
4
5
6

因此,我应该在这些R命令之前添加流程?
mbaitoff 2012年

@mbaitoff:是的。为了进行测试,我创建了一个文件foo,该文件summary (as.numeric (readLines()))的第一行包含,然后其余部分每行包含一个数字数据项。在readLines()刚刚从标准输入读取(这是所有的下面,直到文件末尾)。
韦恩

看起来我们R在这两个答案中都认真对待,这似乎是完成一项微小任务的巨大工具。好吧,答案是可行的,但是无论如何,除了还有什么R
mbaitoff 2012年

2
@mbaitoff:可以将Python与一起使用scipy,尤其是如果您已经使用Python。如果您使用/喜欢Clojure(基于JVM的lisp,clojure.org),则基于此环境Incanterincanter.org)。您也可以尝试gnu Octave。
韦恩

21

尝试“ st”:

$ seq 1 10 | st
N   min   max   sum   mean  stddev
10  1     10    55    5.5   3.02765

$ seq 1 10 | st --transpose
N       10
min     1
max     10
sum     55
mean    5.5
stddev  3.02765

您还可以看到五个数字摘要:

$ seq 1 10 | st --summary
min  q1    median   q3    max
1    3.5   5.5      7.5   10

你可以在这里下载:

https://github.com/nferraz/st

(免责声明:我写了这个工具:))


欢迎使用该站点@ user2747481。您介意将此答案充实吗?我们希望我们的答案大部分都是独立的。由于您是新手,因此您可能需要阅读我们的关于页面,其中包含新用户的信息。
gung-恢复莫妮卡

谢谢!截至2019年st,可通过Homebrew获得brew install st
Noah Sussman

当心st可能还提到了simple terminal
Skippy le Grand Gourou

10

R提供了一个称为Rscript的命令。如果您只能在命令行上粘贴几个数字,请使用此衬纸:

Rscript -e 'summary(as.numeric(commandArgs(TRUE)))' 3 4 5 9 7

导致

Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
3.0     4.0     5.0     5.6     7.0     9.0 

如果要读取标准输入,请使用以下命令:

echo 3 4 5 9 7 | Rscript -e 'summary(as.numeric(read.table(file("stdin"))))'

如果标准输入上的数字用回车符分隔(即每行一个数字),请使用

Rscript -e 'summary(as.numeric(read.table(file("stdin"))[,1]))'

可以为这些命令创建别名:

alias summary='Rscript -e "summary(as.numeric(read.table(file(\"stdin\"))[,1]))"'
du -s /usr/bin/* | cut -f1 | summary
Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
0.0     8.0    20.0    93.6    44.0  6528.0

+1:对不起,我刚刚找到Rscript并编辑了我的答案以包括此内容,因此我们得到了类似的答案。您的read.table想法是解决每行一个项目的好方法。
韦恩

好的,感谢您的感谢和+1。
Arnaud 2012年

3

datamash是另一个不错的选择。它来自GNU工程。

如果您有自制软件/ linuxbrew,则可以执行以下操作:

brew install datamash


2

还有一个simple-r,它几乎可以完成R所能完成的所有工作,但击键次数却更少:

https://code.google.com/p/simple-r/

要计算基本描述性统计数据,必须输入以下一项:

r summary file.txt
r summary - < file.txt
cat file.txt | r summary -

没有任何简单的R!


2

这些注释中也引用了sta,它是st的c ++变体。

用c ++编写,它速度很快并且可以处理大型数据集。它使用简单,包括选择无偏估计或有偏估计,并且可以输出更详细的信息,例如标准误差。

您可以从github下载sta 。

免责声明:我是sta的作者。


1

以防万一,有datastat

https://sourceforge.net/p/datastat/code/

一个简单的程序,用于Linux从命令行计算简单的统计信息。例如,

猫file.dat | 数据统计

将为file.dat的每一列输出所有行的平均值。如果需要了解标准偏差min,max,则可以分别添加--dev,-min和--max选项。

datastat可以根据一个或多个“键”列的值来汇总行。

它用C ++编写,运行速度快,占用内存少,并且可以与其他工具(例如cut,grep,sed,sort,awk等)很好地进行管道传输。


1

您可能还考虑使用clistats。它是一个高度可配置的命令行界面工具,用于计算定界输入数字流的统计信息。

I / O选项

  • 输入数据可以来自文件,标准输入或管道
  • 可以将输出写入文件,标准输出或管道
  • 输出使用以“#”开头的标头来启用管道到gnuplot

解析选项

  • 基于信号,文件结尾或空白行的检测来停止处理
  • 可以设置注释和分隔符
  • 可以从处理中过滤掉列
  • 可以基于数值约束从处理中过滤出行
  • 可以基于字符串约束将行从处理中过滤掉
  • 初始标题行可以跳过
  • 固定数量的行可以处理
  • 重复的分隔符可以忽略
  • 行可以重整为列
  • 严格执行仅处理相同大小的行
  • 包含列标题的行可用于标题输出统计信息

统计选项

  • 摘要统计(计数,最小值,平均值,最大值,标准差)
  • 协方差
  • 相关性
  • 最小二乘偏移
  • 最小二乘斜率
  • 直方图
  • 过滤后的原始数据

注意:我是作者。


1

可以用于在ASCII模式下计算统计信息和视图分布的工具是ministat。它是FreeBSD的工具,但也打包用于Debian / Ubuntu等流行的Linux发行版。

用法示例:

$ 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

0

X¯ñ=ñ-1个X¯ñ-1个+Xññ
sñ2=小号ññ-1个
小号ñ=小号ñ-1个+Xñ-X¯ñ-1个Xñ-X¯ñ

X¯0=小号0=0


X一世FLOAT_MAX-1.0X一世-X一世+1个X一世-X一世-1个

这实际上是气候调节器的功能(有关详细信息和其他功能,请参见答案)。
dpmcmlxxvi 2015年

0

偶然发现了这个旧线程,正在寻找其他东西。想要相同的东西,找不到简单的东西,所以在perl中做了,相当琐碎,但是一天要多次使用:http : //moo.nac.uci.edu/~hjm/stats

例:

 $ ls -l | scut -f=4 | stats                
Sum       9702066453
Number    501
Mean      19365402.1017964
Median    4451
Mode      4096  
NModes    15
Min       0
Max       2019645440
Range     2019645440
Variance  1.96315423371944e+16
Std_Dev   140112605.91822
SEM       6259769.58393047
Skew      10.2405932543676
Std_Skew  93.5768354979843
Kurtosis  117.69005473429

(cut的速度较慢,但​​可以说是cut版本的更容易):http : //moo.nac.uci.edu/~hjm/scut 描述:http//moo.nac.uci.edu/~hjm/scut_cols_HOWTO。 html


0

另一个工具:tsv-汇总来自eBay的TSV实用程序。支持许多基本的摘要统计信息,例如最小值,最大值,平均值,中位数,分位数,标准差,MAD等。它适用于大型数据集,并支持多个字段和按键分组。输出以制表符分隔。1到1000的数字序列示例,每行一个:

$ seq 1000 | tsv-summarize --min 1 --max 1 --median 1 --sum 1
1   1000    500.5   500500

标题通常是从输入中的标题行生成的。如果输入没有标题,则可以使用-w开关添加一个:

$ seq 1000 | tsv-summarize -w --min 1 --max 1 --median 1 --sum 1
field1_min  field1_max  field1_median   field1_sum
1   1000    500.5   500500

免责声明:我是作者。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.