• awk的简要使用


    原文地址:https://www.lujun9972.win/blog/2020/08/23/在命令行进行简单的统计分析/index.html

    使用awk获取最小值、最大值、中位数和平均值

    使用awk先把数据存入一个数组中,然后对数组进行排序后就可以自己写代码找出最小值、最大值、中位数和平均值了:

    #! /usr/bin/awk -f
    {
        sum += $1                   # 假设数据放在第一列
        nums[NR] = $1  # 将数据记录到数组中
    }
    END {
        if (NR == 0) exit  #防止出现处于0的情况To avoid division by zero
    
    <span class="org-preprocessor">asort</span>(nums)  <span class="org-comment-delimiter">#  </span><span class="org-comment">先对数据进行排序,用于记录中位数</span>
    
    <span class="org-comment-delimiter"># </span><span class="org-comment">计算中位数</span>
    median = (<span class="org-variable-name">NR</span> % 2 == 0) ? ( nums[<span class="org-variable-name">NR</span> / 2] + nums[<span class="org-variable-name">NR</span> / 2 + 1] ) / 2  : nums[<span class="org-preprocessor">int</span>(<span class="org-variable-name">NR</span> / 2) + 1]
    
    <span class="org-comment-delimiter"># </span><span class="org-comment">计算平均</span>
    mean = sum/<span class="org-variable-name">NR</span>
    
    <span class="org-preprocessor">printf</span> <span class="org-string">"min = %s, max = %s, median = %s, mean = %s\n"</span>, nums[1], nums[<span class="org-variable-name">NR</span>], median, mean
    

    }

    我们可以实验一下:

    seq -10 3 30|~/bin/calculate.awk
    
    min = -10, max = 29, median = 9.5, mean = 9.5
    

    使用datamash进行统计分析

    使用awk虽然可以进行统计分析,但是需要自己去实现大量的细节,很麻烦。 datamash 则是一个直接提供了基本统计能力的命令行程序。

    datamash的使用非常简单,其调用规则为 datamash 选项 统计操作1 数据列1 [统计操作2 数据列2].... 它会对 数据列N 所表示的数据执行 统计操作N. 其中 数据列 一般是一个表示第几列的数字,但是当数据文件中的第一行是标题时,可以通过 -H 选项来指明数据文件中包含标题行,此时 数据列 可以是标题名来代替。

    常见的选项说明

     分组
    
    <dd>
     datamash支持对数据进行分组统计,通过使用 
     <code>--group=数据列1[,数据列2,数据列3]</code> 可以指明根据哪几个域进行分组
    </dd> 
    
     排序
    
    <dd>
     datamash需要输入的数据是预先经过排序的,若数据未经过排序则需要通过 
     <code>--sort</code> 选项预先进行排序
    </dd> 
    
     忽略大小写差异
    
    <dd>
     通过 
     <code>--ignore-case</code> 选项可以让 datamash 在分组时忽略大小写的差异
    </dd> 
    
     设置分隔符
    
    <dd>
     默认情况下datamash使用 
     <code>TAB</code> 作为列的分隔符,通过 
     <code>--field-separator=x</code> 可以设置 
     <code>x</code> 作为列分隔符,也可以通过 
     <code>--whitespace</code> 设置使用一个或多个空格或者tab作为分隔符。
    </dd> 
    
     转置
    
    <dd>
     通过 
     <code>transpose</code> 选项可以交换行列式
    </dd> 
    
     反转
    
    <dd>
     通过 
     <code>reverse</code> 选项可以反转字段的顺序
    </dd> 
    
     跳过空值
    
    <dd>
     <code>--narm</code> 跳过空域
    </dd> 
    

    常见的统计操作

     count
    
    <dd>
     计算总数据量
    </dd> 
    
     rand
    
    <dd>
     随机返回一个值
    </dd> 
    
     sum
    
    <dd>
     汇总
    </dd> 
    
     min
    
    <dd>
     取最小值
    </dd> 
    
     max
    
    <dd>
     取最大值
    </dd> 
    
     absmin
    
    <dd>
     取绝对值最小的那个值
    </dd> 
    
     absmax
    
    <dd>
     取绝对值最大的那个值
    </dd> 
    
     range
    
    <dd>
     值域范围,即max - min
    </dd> 
    
     mean
    
    <dd>
     取均值
    </dd> 
    
     median
    
    <dd>
     取中位数
    </dd> 
    
     q1
    
    <dd>
     取第一四分位
    </dd> 
    
     q3
    
    <dd>
     取第三四分位
    </dd> 
    
     iqr
    
    <dd>
     取四分位距
    </dd> 
    
     mode
    
    <dd>
     取众数
    </dd> 
    
     antimode
    
    <dd>
     取最少出现的数
    </dd> 
    
     pstdev
    
    <dd>
     总体标准差
    </dd> 
    
     sstdev
    
    <dd>
     样本标准差
    </dd> 
    
     pvar
    
    <dd>
     总体方差
    </dd> 
    
     svar
    
    <dd>
     样本方差
    </dd> 
    
     pskew
    
    <dd>
     总体偏度
    </dd> 
    
     sskew
    
    <dd>
     样本偏度
    </dd> 
    
     pkurt
    
    <dd>
     总体峰度
    </dd> 
    
     skurt
    
    <dd>
     样本峰度
    </dd> 
    
     pcov
    
    <dd>
     总体协方差,需要两组数据,用 
     <code>列1:列2</code> 来表示
    </dd> 
    
     scov
    
    <dd>
     样本协方差,需要两组数据,用 
     <code>列1:列2</code> 来表示
    </dd> 
    
     ppearson
    
    <dd>
     总体皮尔逊相关系数,需要两组数据,用 
     <code>列1:列2</code> 来表示
    </dd> 
    
     spearson
    
    <dd>
     样本皮尔逊相关系数,需要两组数据,用 
     <code>列1:列2</code> 来表示
    </dd> 
    

    例子

    比如上面的awk脚本可以用一行datamash命令代替:

    seq -10 3 30|datamash min 1 max 1 median 1 mean 1
    
    -10     29      9.5     9.5
    
    </article>
  • 相关阅读:
    浅析Java CompletionService
    经验总结13--EF配置
    消息摘要算法-HMAC算法
    03012_预处理对象executeQuery方法(实现数据库的查询)
    GO学习笔记:函数defer
    GO学习笔记:函数传值与传指针
    GO学习笔记:函数作为值、类型
    GO学习笔记:函数Panic和Recover
    GO学习笔记:import
    GO学习笔记:struct类型
  • 原文地址:https://www.cnblogs.com/jinanxiaolaohu/p/16690867.html
Copyright © 2020-2023  润新知