Contents

Linux终端上统计数据

1. 概述

在本教程中,我们将重点介绍用于打印文件中数字聚合静态信息的工具。我们将评估平均数、中位数、众数、标准差等统计数据。

2. 设置

让我们创建一个包含由换行符分隔的数字列表的sample.txt文件:

$ echo '1 2 3 4 5 6 7 8 9 10' |tr ' ' '\n' > sample.txt

在这里,我们使用echo 输出从 1 到 10 的所有数字,以空格分隔。接下来,我们将结果传送到tr 命令,该命令将所有空格转换为换行符。

我们可以使用cat 命令查看sample.txt文件的内容:

$ cat sample.txt
1
2
3
4
5
6
7
8
9
10

接下来,我们将评估这些数字的平均数、中位数、众数、平均数和标准差等统计数据。

3. 使用awk

awk 是一种功能强大的脚本语言,专为文本处理、提取和生成数据报告而设计。

awk不需要编译并允许我们使用逻辑运算符、变量、字符串函数和数字函数。

让我们打印sample.txt文件中数字的平均值:

$ awk '{a+=$1} END{print "mean = " a/NR}' sample.txt
5.5

在这里,我们创建了一个名为a的变量,然后将文件中的所有数字加起来放在第一个字段中。在awk 中,输入中的第一个字段表示为$1。之后,我们将变量a的值除以记录总数 *(NR)*并打印结果。

为了获得中位数,我们使用*gawk , awk的 GNU 表示。gawk具有标准awk*实用程序中不可用的额外命令。

首先,让我们安装gawk

$ sudo apt install gawk

安装后,让我们得到中位数:

$ gawk -v max=100 '
    function median(r,s) { 
       asort(s,t) 
       if (r%2) return t[(r+1)/2]
       else return (t[r/2+1]+t[r/2])/2  
    }
    { 
       count++
       values[count]=$1
       if (count >= max) { 
         print  median(count,values); count=0
       } 
    } 
    END { 
       print  "median = " median(count,values)
    }
    ' sample.txt
median = 5.5

在这里,我们使用*-v 标志将max的值设置为100*。换句话说,我们使用100的值作为限制器。

我们还定义了一个*get_median()*函数来计算数字并打印出中位数。

我们还可以获取sample.txt文件中数字的标准差:

$ awk '{total+=$1; totalsq+=$1*$1} END {print "stdev = " sqrt(totalsq/NR - (total/NR)**2)}' sample.txt
stdev = 2.87228

我们得到数字的总和和它们的平方和,然后用它们来计算标准差。

4. 使用ministat

ministat 是一种统计实用工具,用于计算输入文件或标准输入中数值数据的核心统计特性。

它是 FreeBSD 的一个工具,但也为流行的发行版(如 Debian 和 Ubuntu)打包。

在 Linux 上,我们可以使用包管理器安装ministat

$ sudo apt install ministat

或者,我们可以下载 、构建和安装它。

安装完成后,让我们根据sample.txt文件打印统计数据:

$ cat sample.txt| awk '{print $1}' | ministat -w 70
x <stdin>
+--------------------------------------------------------------------------+
|x       x       x       x       x        x       x       x       x       x|
|            |________________________A___M___________________|            |
+--------------------------------------------------------------------------+
    N           Min           Max        Median           Avg        Stddev
x  10             1            10             6           5.5     3.0276504

在这里,我们使用cat命令打印sample.txt文件中的数据。接下来,我们将结果通过管道传递给awk,它打印第一行数字。最后,我们将结果传送到ministat,它执行统计计算。

如果标准输出不是终端,我们使用*-w标志将输出宽度设置为70* 。

5. 使用perl

** perl代表实用提取和报告语言。它在打印基于通过文件或标准输入输入的数据的报告时非常有效。**它已经发展成为一种通用语言,广泛用于编写从快速一行到全面应用程序的程序。

让我们打印sample.txt文件中数字的聚合统计数据:

$ cat sample.txt | perl -e '
  use List::Util qw(max min sum);
  @r=();
  while(<>){
      $sqtotal+=$_*$_; push(@r,$_)
  };
  [[email protected]](/cdn_cgi/l/email_protection); $total=sum(@r); $average=$total/@r; $m_num=max(@r); $mm_num=min(@r);
  $stdev=sqrt($sqtotal/$count-($total/$count)*($total/$count));
  $middle_num=int @r/2; @srtd=sort @r;
  if(@r%2){
      $median=$srtd[$middle_num];
  }
  else{
      $median=($srtd[$middle_num-1]+$srtd[$middle_num])/2;
  };
  print "records:$count\n sum:$total\n avg:$average\n std:$stdev\n med:$median\n max:$m_num min:$mm_num";'
records:10
sum:55
avg:5.5
std:2.87228132326901
med:4.5
max:10
min:1

在这里,我们使用*-e*标志来执行我们的 Perl 代码。以下是脚本某些部分的细分:

  • 使用 List::Util qw(max min sum):这是一个使我们能够使用maxminsum函数的模块。
  • @r=():我们正在定义一个名为*@r*的数组变量并将其值设置为空白列表
  • while(<>)… :这是一个 while 循环,它获取sample.txt文件中每个数字的平方和。我们还将文件中的每个数字推送到*@r* 数组变量。

然后,我们创建和评估代表记录数 ( $count )、总和 ( $total )、平均值 ( $average )、标准差 ( $stdev )、中位数 ( $median )、最大值 ( $m_num )的变量和最小值( $mm_num )。

6. 使用datamash

**GNU *datamash *是一个命令行实用程序,可对数据文件或标准输入执行文本、数字和统计操作。**它是可移植的,有助于自动化分析管道,而无需编写代码或短脚本。

让我们从本地包管理器安装datamash

$ sudo apt install datamash

安装后,让我们根据sample.txt文件中的数字打印聚合统计数据:

$ cat sample.txt | datamash sum 1 mean 1 median 1 mode 1 sstdev 1
55	5.5	5.5	1	3.0276503540975

在这里,我们使用datamash打印总和、平均值、中位数、众数和样本标准差。

7. 使用st

st 是一个简单的命令行实用程序,用于显示来自标准输入或文件的数字统计信息。

要安装它,我们首先从它在 GitHub 上的存储库下载它:

$ git clone https://github.com/nferraz/st.git

然后,让我们导航到目录并使用perl命令生成构建文件:

$ cd st && perl Makefile.PL
Generating a Unix-style Makefile
Writing Makefile for App::St
Writing MYMETA.yml and MYMETA.json

最后,我们使用make命令来构建和安装st

$ sudo make install
Manifying 1 pod document
Manifying 1 pod document
Appending installation info to /usr/local/lib/x86_64-linux-gnu/perl/5.30.0/perllocal.pod

安装后,我们可以导航回我们的工作目录以生成聚合统计数据:

$ st sample.txt
N	min	max	sum	mean	stddev
10	1	10	55	5.5	3.02765

也可以使用一些可用选项来过滤结果:

$ st --sum sample.txt
55

8. 使用clistats

** clistats 是一个命令行实用程序,用于根据一组分隔的输入数字计算统计数据。

数字可以用逗号或制表符分隔。但是,默认分隔符是逗号。

我们可以传递来自文件、重定向管道或标准输入的输入。

要使用clistats,让我们首先从其存储库下载它:

$ git clone https://github.com/dpmcmlxxvi/clistats.git

接下来,我们可以导航到下载的目录并运行make 命令来构建clistats

$ cd clistats && make
g++ -O2 src/clistats.cpp -o clistats

这会在目录中创建一个名为clistats的文件。我们将使用此文件生成报告。

最后,我们将sample.txt文件复制到clistats目录下,然后生成聚合统计数据:

$ ./clistats < sample.txt
#=================================================================
#                      Statistics
#=================================================================
#   Dimension   Count    Minimum       Mean     Maximum      Stdev
#-----------------------------------------------------------------
            1      10   1.000000   5.500000   10.000000   2.872281