是否有任何命令行工具可以接受来自标准输入的数字流(以ascii格式),并提供该流的基本描述性统计信息,例如最小值,最大值,平均值,中位数,RMS,分位数等?欢迎输出可被命令行链中的下一个命令解析。工作环境是Linux,但是欢迎使用其他选项。
是否有任何命令行工具可以接受来自标准输入的数字流(以ascii格式),并提供该流的基本描述性统计信息,例如最小值,最大值,平均值,中位数,RMS,分位数等?欢迎输出可被命令行链中的下一个命令解析。工作环境是Linux,但是欢迎使用其他选项。
Answers:
您可以使用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
命令之前添加流程?
foo
,该文件summary (as.numeric (readLines()))
的第一行包含,然后其余部分每行包含一个数字数据项。在readLines()
刚刚从标准输入读取(这是所有的下面,直到文件末尾)。
R
在这两个答案中都认真对待,这似乎是完成一项微小任务的巨大工具。好吧,答案是可行的,但是无论如何,除了还有什么R
?
scipy
,尤其是如果您已经使用Python。如果您使用/喜欢Clojure(基于JVM的lisp,clojure.org),则基于此环境Incanter
(incanter.org)。您也可以尝试gnu Octave。
尝试“ 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
你可以在这里下载:
(免责声明:我写了这个工具:))
st
,可通过Homebrew获得brew install st
st
可能还提到了simple terminal
。
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
read.table
想法是解决每行一个项目的好方法。
还有一个simple-r,它几乎可以完成R所能完成的所有工作,但击键次数却更少:
https://code.google.com/p/simple-r/
要计算基本描述性统计数据,必须输入以下一项:
r summary file.txt
r summary - < file.txt
cat file.txt | r summary -
没有任何简单的R!
以防万一,有datastat
https://sourceforge.net/p/datastat/code/
一个简单的程序,用于Linux从命令行计算简单的统计信息。例如,
猫file.dat | 数据统计
将为file.dat的每一列输出所有行的平均值。如果需要了解标准偏差min,max,则可以分别添加--dev,-min和--max选项。
datastat可以根据一个或多个“键”列的值来汇总行。
它用C ++编写,运行速度快,占用内存少,并且可以与其他工具(例如cut,grep,sed,sort,awk等)很好地进行管道传输。
您可能还考虑使用clistats。它是一个高度可配置的命令行界面工具,用于计算定界输入数字流的统计信息。
注意:我是作者。
可以用于在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
偶然发现了这个旧线程,正在寻找其他东西。想要相同的东西,找不到简单的东西,所以在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
另一个工具: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
免责声明:我是作者。