原文地址: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>