命令行实用程序,用于在linux中打印数字统计信息

MK.*_*MK. 65 linux statistics command-line

我经常发现自己的文件每行有一个数字.我最终在excel中导入它来查看中位数,标准差等内容.

在linux中是否有一个命令行实用程序来做同样的事情?我通常需要找到平均值,中位数,最小值,最大值和标准偏差.

Mat*_*ker 53

这对于R来说是轻而易举的.对于一个看起来像这样的文件:

1
2
3
4
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)

用这个:

R -q -e "x <- read.csv('nums.txt', header = F); summary(x); sd(x[ , 1])"
Run Code Online (Sandbox Code Playgroud)

要得到这个:

       V1       
 Min.   : 1.00  
 1st Qu.: 3.25  
 Median : 5.50  
 Mean   : 5.50  
 3rd Qu.: 7.75  
 Max.   :10.00  
[1] 3.02765
Run Code Online (Sandbox Code Playgroud)

编辑添加一些澄清评论(因为我回到这里并且不记得一些理由):

  • -q旗帜压制了R的启动许可并帮助输出
  • -e标记告诉R您会从终端传递的表达
  • xdata.frame基本上是一张桌子.它是一个容纳多个向量/列数据的结构,如果您只是在单个向量中读取,这有点奇怪.这会影响您可以使用的功能.
  • 有些功能,如summary()自然适应data.frames.如果x有多个字段,summary()则会为每个字段提供上述描述性统计信息.
  • 但是sd()一次只能获取一个向量,这就是我x为该命令编制索引(x[ , 1]返回第一列x)的原因.您可以使用apply(x, MARGIN = 2, FUN = sd)获取所有列的SD.

  • 为了节省如何在Ubuntu上获得R的额外搜索:`sudo apt-get install r-base` (4认同)

use*_*481 40

使用"st"(https://github.com/nferraz/st)

$ st numbers.txt
N    min   max   sum   mean  stddev
10   1     10    55    5.5   3.02765
Run Code Online (Sandbox Code Playgroud)

要么:

$ st numbers.txt --transpose
N      10
min    1
max    10
sum    55
mean   5.5
stddev 3.02765
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,`st` 也可能引用`simple terminal`。 (3认同)
  • 如果您使用的是Homebrew安装,则就像`brew install st`一样简单。 (2认同)

Ski*_*rou 33

对于您可以使用的平均值,中位数和标准差awk.这通常比R解决方案更快.例如,以下将打印平均值:

awk '{a+=$1} END{print a/NR}' myfile
Run Code Online (Sandbox Code Playgroud)

(NR是一个awk记录数量的变量,$1意味着该行的第一个(空格分隔的)参数($0将是整行,这也可以在这里工作但原则上不太安全,尽管对于计算它可能只是取的第一个参数反正)和END意味着下面的命令将在处理了整个文件后(一个也可能初始化被执行a0在一BEGIN{a=0}语句)).

这是一个简单的awk脚本,它提供了更详细的统计信息(将CSV文件作为输入,否则更改FS):

#!/usr/bin/awk -f

BEGIN {
    FS=",";
}
{
   a += $1;
   b[++i] = $1;
}
END {
    m = a/NR; # mean
    for (i in b)
    {
        d += (b[i]-m)^2;
        e += (b[i]-m)^3;
        f += (b[i]-m)^4;
    }
    va = d/NR; # variance
    sd = sqrt(va); # standard deviation
    sk = (e/NR)/sd^3; # skewness
    ku = (f/NR)/sd^4-3; # standardized kurtosis
    print "N,sum,mean,variance,std,SEM,skewness,kurtosis"
    print NR "," a "," m "," va "," sd "," sd/sqrt(NR) "," sk "," ku
}
Run Code Online (Sandbox Code Playgroud)

将min/max添加到此脚本是很简单的,但它很容易管道sorthead/ tail :

sort -n myfile | head -n1
sort -n myfile | tail -n1
Run Code Online (Sandbox Code Playgroud)


Ali*_*nau 19

可用于计算ASCII模式下的统计和视图分布的Ya工具是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
Run Code Online (Sandbox Code Playgroud)


bua*_*bua 15

是的,它被称为perl
,这里简洁的单行:

perl -e 'use List::Util qw(max min sum); @a=();while(<>){$sqsum+=$_*$_; push(@a,$_)}; $n=@a;$s=sum(@a);$a=$s/@a;$m=max(@a);$mm=min(@a);$std=sqrt($sqsum/$n-($s/$n)*($s/$n));$mid=int @a/2;@srtd=sort @a;if(@a%2){$med=$srtd[$mid];}else{$med=($srtd[$mid-1]+$srtd[$mid])/2;};print "records:$n\nsum:$s\navg:$a\nstd:$std\nmed:$med\max:$m\min:$mm";'
Run Code Online (Sandbox Code Playgroud)

$ cat tt
1
3
4
5
6.5
7.
2
3
4
Run Code Online (Sandbox Code Playgroud)

和命令

cat tt | perl -e 'use List::Util qw(max min sum); @a=();while(<>){$sqsum+=$_*$_; push(@a,$_)}; $n=@a;$s=sum(@a);$a=$s/@a;$m=max(@a);$mm=min(@a);$std=sqrt($sqsum/$n-($s/$n)*($s/$n));$mid=int @a/2;@srtd=sort @a;if(@a%2){$med=$srtd[$mid];}else{$med=($srtd[$mid-1]+$srtd[$mid])/2;};print "records:$n\nsum:$s\navg:$a\nstd:$std\nmed:$med\max:$m\min:$mm";'
records:9
sum:35.5
avg:3.94444444444444
std:1.86256162380447
med:4
max:7.
min:1
Run Code Online (Sandbox Code Playgroud)

  • 我确信它有效,但是这一切都能使我的眼睛流血.为什么不创建一个脚本,而不是那个暴行? (19认同)
  • 我很确定"函数式语言"!="尽可能简洁地将所有内容写在一行". (18认同)
  • 仅仅因为你*可以*做某事一行并不意味着你应该*.* (9认同)
  • Oneliners绝对不是为了阅读.但他们很高兴只是复制粘贴到我的腻子,并从apache日志中获取一些数字的统计数据...所以bua roxx (7认同)
  • 命令行(至少是bash)也支持多行字符串。只需在文字内部使用换行符即可。 (2认同)

gho*_*oti 12

意思:

awk '{sum += $1} END {print "mean = " sum/NR}' filename
Run Code Online (Sandbox Code Playgroud)

中位数:

gawk -v max=128 '

    function median(c,v,    j) { 
       asort(v,j) 
       if (c % 2) return j[(c+1)/2]
       else return (j[c/2+1]+j[c/2])/2.0
    }

    { 
       count++
       values[count]=$1
       if (count >= max) { 
         print  median(count,values); count=0
       } 
    } 

    END { 
       print  "median = " median(count,values)
    }
    ' filename
Run Code Online (Sandbox Code Playgroud)

模式:

awk '{c[$1]++} END {for (i in count) {if (c[i]>max) {max=i}} print "mode = " max}' filename
Run Code Online (Sandbox Code Playgroud)

这种模式计算需要偶数个样本,但你看它是如何工作的......

标准偏差:

awk '{sum+=$1; sumsq+=$1*$1} END {print "stdev = " sqrt(sumsq/NR - (sum/NR)**2)}' filename
Run Code Online (Sandbox Code Playgroud)

  • 做得很好-并且使用了每个Linux发行版上的工具。 (2认同)

Mat*_*ker 8

data_hacks 是一个用于基本统计信息的Python命令行实用程序.

该页面的第一个示例产生了所需的结果:

$ cat /tmp/data | histogram.py
# NumSamples = 29; Max = 10.00; Min = 1.00
# Mean = 4.379310; Variance = 5.131986; SD = 2.265389
# each * represents a count of 1
    1.0000 -     1.9000 [     1]: *
    1.9000 -     2.8000 [     5]: *****
    2.8000 -     3.7000 [     8]: ********
    3.7000 -     4.6000 [     3]: ***
    4.6000 -     5.5000 [     4]: ****
    5.5000 -     6.4000 [     2]: **
    6.4000 -     7.3000 [     3]: ***
    7.3000 -     8.2000 [     1]: *
    8.2000 -     9.1000 [     1]: *
    9.1000 -    10.0000 [     1]: *
Run Code Online (Sandbox Code Playgroud)


ole*_*enb 8

另一个工具:https//www.gnu.org/software/datamash/

# Example: calculate the sum and mean of values 1 to 10:
$ seq 10 | datamash sum 1 mean 1
55 5.5
Run Code Online (Sandbox Code Playgroud)

可能会更常见地打包(我发现至少第一个工具是为nix预打包的)


小智 7

以防万一,这是datastat一个简单的程序,用于Linux计算命令行的简单统计.例如,

cat file.dat | datastat
Run Code Online (Sandbox Code Playgroud)

将为file.dat的每列输出所有行的平均值.如果你需要知道的标准偏差,最小值,最大值,您可以添加--dev,--min--max分别选择.

datastat有可能根据一个或多个"键"列的值聚合行.例如,

cat file.dat | datastat -k 1
Run Code Online (Sandbox Code Playgroud)

对于在第一列("键")上找到的每个不同值,将生成在键上具有相同值的所有行之间聚合的所有其他列值的平均值.您可以使用更多列作为关键字段(例如,-k 1-3,-k 2,4等...).

它是用C++编写,运行速度快和小内存占用,可以用其他工具,如管道很好cut,grep,sed,sort,awk等.


dpm*_*xvi 7

您也可以考虑使用clistats.它是一个高度可配置的命令行界面工具,用于计算分隔输入数字流的统计信息.

I/O选项

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

解析选项

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

统计选项

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

注意:我是作者.


Jos*_*iro 6

我发现自己想在shell管道中执行此操作,并且花了一段时间花了R的所有正确参数。这是我想出的:

seq 10 | R --slave -e 'x <- scan(file="stdin",quiet=TRUE); summary(x)' Min. 1st Qu. Median Mean 3rd Qu. Max. 1.00 3.25 5.50 5.50 7.75 10.00

--slave选项“使(S)R运行尽可能平静......这意味着--quiet和--no保存。” -e选项告诉R将以下字符串视为R代码。第一条语句从standard in读取,并将读取的内容存储在名为“ x”的变量中。该函数的quiet=TRUE选项scan禁止写一行,该行表示已读取多少项。第二条语句将该summary函数应用于x,产生输出。