原文地址: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 asort(nums) # 先对数据进行排序,用于记录中位数 # 计算中位数 median = (NR % 2 == 0) ? ( nums[NR / 2] + nums[NR / 2 + 1] ) / 2 : nums[int(NR / 2) + 1] # 计算平均 mean = sum/NR printf "min = %s, max = %s, median = %s, mean = %s\n", nums[1], nums[NR], 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
选项来指明数据文件中包含标题行,此时 数据列
可以是标题名来代替。
常见的选项说明
-
分组
-
datamash支持对数据进行分组统计,通过使用
--group=数据列1[,数据列2,数据列3]
可以指明根据哪几个域进行分组
排序
-
datamash需要输入的数据是预先经过排序的,若数据未经过排序则需要通过
--sort
选项预先进行排序
忽略大小写差异
-
通过
--ignore-case
选项可以让 datamash 在分组时忽略大小写的差异
设置分隔符
-
默认情况下datamash使用
TAB
作为列的分隔符,通过--field-separator=x
可以设置x
作为列分隔符,也可以通过--whitespace
设置使用一个或多个空格或者tab作为分隔符。
转置
-
通过
transpose
选项可以交换行列式
反转
-
通过
reverse
选项可以反转字段的顺序
跳过空值
-
--narm
跳过空域
常见的统计操作
-
count
- 计算总数据量 rand
- 随机返回一个值 sum
- 汇总 min
- 取最小值 max
- 取最大值 absmin
- 取绝对值最小的那个值 absmax
- 取绝对值最大的那个值 range
- 值域范围,即max - min mean
- 取均值 median
- 取中位数 q1
- 取第一四分位 q3
- 取第三四分位 iqr
- 取四分位距 mode
- 取众数 antimode
- 取最少出现的数 pstdev
- 总体标准差 sstdev
- 样本标准差 pvar
- 总体方差 svar
- 样本方差 pskew
- 总体偏度 sskew
- 样本偏度 pkurt
- 总体峰度 skurt
- 样本峰度 pcov
-
总体协方差,需要两组数据,用
列1:列2
来表示
scov
-
样本协方差,需要两组数据,用
列1:列2
来表示
ppearson
-
总体皮尔逊相关系数,需要两组数据,用
列1:列2
来表示
spearson
-
样本皮尔逊相关系数,需要两组数据,用
列1:列2
来表示
例子
比如上面的awk脚本可以用一行datamash命令代替:
seq -10 3 30|datamash min 1 max 1 median 1 mean 1
-10 29 9.5 9.5