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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章