目录




使用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 ># </span><span >先对数据进行排序,用于记录中位数</span>

<span ># </span><span >计算中位数</span>
median = (<span >NR</span> % 2 == 0) ? ( nums[<span >NR</span> / 2] + nums[<span >NR</span> / 2 + 1] ) / 2 : nums[<span class="org-preprocessor">int</span>(<span >NR</span> / 2) + 1]

<span ># </span><span >计算平均</span>
mean = sum/<span >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 >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>