概述
热爱美食的朋友们,安利我朋友目前正在运营的一个美食餐厅公众号:douke_home
也非常欢迎大伙儿前来我朋友餐厅探索美味,这是豆壳餐厅地址:(1) 苏州市姑苏区学士街418号(距苏州地铁1号线养育巷站3号口390m); (2)苏州市姑苏区南新路与西中市交叉口
文章目录
- GNU Datamash 1.3
- 简介
- 安装
- 参数详解
- 获取帮助信息
- 参数解释
- 参数选项
- 操作注释
- 实例
- 1. Summary Statistics
- 2. Header Lines and Column Names
- 3. 字段分隔符
- 4. Column Ranges
- 5. Transpose and Reverse
- 6. Groupby
- 7. Check
- 8. Crosstab
- 9. Rounding numbers
- 10. Binning numbers
- 11. Binning strings
GNU Datamash 1.3
简介
GNU datamash是一个命令行程序,可以直接在Linux命令行中对输入的文本数据文件执行数字或文本常用的统计操作。
安装
wget http://ftp.gnu.org/gnu/datamash/datamash-1.3.tar.gz
tar -xzf datamash-1.3.tar.gz
cd datamash-1.3
./configure
make
make check
sudo make install
参数详解
获取帮助信息
#Linux 环境下:
# 简要介绍
datamash --help
# 详情介绍
man datamash
# 完整的手册
info datamash
# 网页版手册
## https://www.gnu.org/software/datamash/manual/datamash.html
参数解释
Usage: datamash [OPTION] op [fld] [op fld ...]
'op': 执行的操作(operation)
'fld': 指定输入文件的字段(field)。'fld' 可以是数字,譬如1表示输入文件的第一字段;
也可以是表头的字段名称。如果需要对多个字段同时操作,则可以用逗号分隔字段,如:'1,6,8';
或者使用范围符号,如:'2-8';或者使用冒号指定一对字段进行操作,如:'pcov 2:6'。
# 字段可对应理解为文本文件中的每一列(column)
参数选项
1. Grouping Options:
-f, --full:在执行操作的结果前输出所有输入行,默认情况仅打印分组键名(grouped keys)
-g, --group=X[,Y,Z]
按照 X,[Y,Z]进行分组; 等同于primary operation的 'groupby'
--header-in
第一个输入行作为列标题
--header-out
输出列标题作为第一行
-H, --headers
等同于 '--header-in --header-out'
-i, --ignore-case
比较文本时忽略大小写;这将影响分组和字符串操作
-s, --sort
分组之前对输入文件进行排序
2. File Operation Options:
--no-strict
允许行具有不同长度/数量的字段
--filler=X
用X填充缺失的值 (默认值:%s)
3. General Options:
-t, --field-separator=X
字段分隔符使用X而非TAB分隔符
--format=FORMAT
使用printf浮点格式打印数值
--output-delimiter=X
使用X作为输出字段分隔符 (默认值: 分隔符同 -t/-W 参数中相同)
--narm
跳过 NA/NaN
-R, --round=N
根据不同函数(eg. round/ceil/floor/trunc/frac...)进行约束数值的小数点后N位
-W, --whitespace
使用一个或多个空格或TAB作为字段分隔符
-z, --zero-terminated
结束行为0字节,而不是换行
操作注释
可应用的操作有:
- Primary operations:
groupby, crosstab, transpose, reverse, check
-
groupby
: 分组统计,同R中dplyr::group_by()
-
crosstab
: 应用交叉列表对两个字段进行比较,默认是应用count
计算,例如第一字段(a/b)和第二字段(x/y),统计每对(ax, ay, bx, by)出现的次数,同EXCEL的透视表. -
transpose
: 转置文本文件的行和列 -
reverse
: 反转文件中的字段顺序,要求文件中每行的字段数量是一致的 -
check
: 验证输入的表格结构(确保所有行中字段数量相同)
- Line-Filtering operations:
rmdup
rmdup
: 删除具有重复键值的行
- Per-Line operations:
base64, debase64, md5, sha1, sha256, sha512, bin, strbin, round, floor, ceil, trunc, frac
-
base64
: 将字段编码为Base64, Base64是一种基于64个可打印字符来表示二进制数据的表示方法。 -
debase64
: 将字段解码为Base64。如果字段是无效的Base64值,无法解码,则退出并显示错误 。 -
md5
: 计算字段的md5哈希值 -
sha1
: 计算字段的sha1哈希值 -
sha256
: 计算字段的sha256哈希值 -
sha512
: 计算字段的sha512哈希值
- Numeric Grouping operations:
sum, min, max, absmin, absmax, range
-
sum
: 求和 -
min
&max
: 最小值 & 最大值 -
absmin
&absmax
: 最小绝对值 & 最大绝对值 -
range
: 数值范围(最大值-最小值)
- Textual/Numeric Grouping operations:
count, first, last, rand, unique, collapse, countunique
count
: 分组中元素计数first
&last
: 分组中的第一个值 & 分组中的最后一个值rand
: 分组中的随机值unique
: 逗号分隔的唯一值的排序列表collapse
: 逗号分隔的所有输入值的列表countunique
: 唯一值/不同值的数量
- Statistical Grouping operations:
mean, trimmean, median, q1, q3, iqr, perc, mode, antimode, pstdev, sstdev, pvar, svar, mad, madraw, pskew, sskew, pkurt, skurt, dpo, jarque, scov, pcov, spearson, ppearson
mean
&median
&mode
&antimode
: 平均值 & 中位数 & 频率最多的数值(众数) & 频率最少的数值trimmean[:PERCENT]
: 先从数据集的头部和尾部(最高值和最低值)除去一定百分比(0-0.5)的数据点,然后再求平均值。trimmean:0
计算结果等于平均值;trimmean:0.5
计算结果等于中位数。用法类似EXCEL中TRIMMEAN(array, percent)
函数q1
&q3
: 第一个四分位数值(位于25%) & 第三个四分位数值 (位于75%)iqr
: 四分位差。它是上四分位数(Q3,即位于75%)与下四分位数(Q1,即位于25%)的差。perc[:PERCENTILE]
: 百分位数pstdev
&sstdev
: 总体标准偏差 (对应excel函数:STDEVP) & 样本标准差 (对应excel函数:STDEV)pvar
&svar
: 总体方差 & 样本方差mad
: 正态分布的绝对中位差,按常数1.4826缩放,类似R中mad(x, center = median(x), constant = 1.4826, na.rm = FALSE, low = FALSE, high = FALSE)
madraw
: 原绝对中位差(未缩放的)sskew
&pskew
: 样本偏度 & 总体偏度skurt
&pkurt
: 样本峰度 & 总体峰度
1、偏度(Skewness):描述数据分布不对称的方向及其程度
偏度的计算值说明:
x ≈ 0:
分布是对称的,服从正态分布;
x > 0:
正偏态 / 分布为右偏,即拖尾在右边,峰尖在左边
x < 0:
负偏态 / 分布为左偏,即拖尾在左边,峰尖在右边
x > 1:
高度正偏态
1 > x >
0.5:
moderately skewed right
0.5 > x > -0.5:
approximately symmetric
-0.5 > x > -1:
moderately skewed left
-1 > x:
高度负偏态
偏度值代表更多的值集中在什么地方,如果为0,就说明是标准高斯分布,如果为正,说明集中在右侧,值越大,就越往右侧偏,值越小就越往左侧偏。
2、峰度(Kurtosis):描述数据分布形态的陡缓程度
x ≈ 0: 分布的峰态合适,服从正态分布(不胖不瘦);
x > 0: 分布的峰态陡峭(高尖);
x < 0: 分布的峰态平缓(矮胖);
dpo
: D’Agostino-Pearson Omnibus正态性检验的p值。空假设(null hypothesis)是数据符合正态分布,P值小于0.05表明数据不符合正态分布。jarjue
: Jarque-Beta 正态性检验的p值。空假设(null hypothesis)是数据符合正态分布,P值小于0.05表明数据不符合正态分布。scov
&pcov
: 样本协方差 & 总体协方差spearson
&ppearson
: 样本皮尔逊相关系数 & 总体皮尔逊相关系数
补充材料:R语言做正态性检验
实例
注意:以下使用的文件均来自软件(PATH: datamash-1.3/examples
)自带的数据集
1. Summary Statistics
# 先排序,然后根据第二字段分组,最后统计分组中第二字段的元素出现的次数
datamash --sort groupby 2 count 2 < scores.txt
# 先排序,然后根据第二字段分组,最后输出分组中第三字段的最小值和最大值
datamash --sort groupby 2 min 3 max 3 < scores.txt
# 先排序,然后根据第二字段分组,最后输出分组中第三字段的均值和总体标准偏差
datamash --sort groupby 2 mean 3 pstdev 3 < scores.txt
# 先排序,然后根据第二字段分组,最后输出分组中第三字段的中位数、第一个四分位数值、第三个四分位数值和四分位差
datamash --sort groupby 2 median 3 q1 3 q3
3 iqr 3
< scores.txt
2. Header Lines and Column Names
#(1) Header Lines
#如果输入文件中没有表头(列标题),则可以使用 --header-out 在输出文件的第一行添加表头
datamash --sort --header-out groupby 2 min
3 max 3 < scores.txt
#如果输入文件中有表头(列标题),则可以使用 --header-in 跳过该行。
datamash --sort --header-in groupby 2 mean 3 < scores_h.txt
#使用 --header/-H 则可以将输入文件中的表头作为输出文件的表头
datamash --sort --headers groupby 2 mean 3 < scores_h.txt
#使用-sH 效果等同于 --sort --headers
datamash -sH groupby 2 mean 3 < scores_h.txt
#(2) Column Names
#当输入文件有表头,则也可以使用列名而非对应的列索引数字
datamash --sort --headers groupby Major mean Score < scores_h.txt
3. 字段分隔符
# datamash 默认的字段分隔符是TAB, 多个TAB表示多个字段
printf '1tt2n' | datamash sum 3
printf '1tt2n' | cut -f3
# -W 一个或多个连续空格均被当做一个字段分隔符
printf '1
t
2n' | datamash -W sum 2
printf '1
t
2n' | datamash -W sum 3
# -t, 自定义分隔符
printf '1,10,,100n' | datamash -t, sum 4
4. Column Ranges
# datamash 对指定列范围的格式类似shell中cut的用法
seq 100 | paste - - - - | datamash sum 1 sum 2 sum 3 sum 4
seq 100 | paste - - - - | datamash sum 1,2,3,4
seq 100 | paste - - - - | datamash sum 1-4
seq 100 | paste - - - - | datamash sum 1-3,4
seq 100 | paste - - - - | datamash sum 1-4 mean 1-4
5. Transpose and Reverse
#(1)Transpose: 转置,类似R中t()函数
#--no-strict:允许行具有不同长度/数量的字段。当原始文件中含有缺失值时,则需要添加此参数。
datamash --no-strict transpose < input1.txt
#--filler XYZ:用XYZ填充缺失的值
datamash --no-strict --filler XYZ transpose < input1.txt
#(2)Reverse: 反转文件中的字段顺序,要求文件中每行的字段数量是一致的
$ cat input.txt
Sample
Year
Count
A
2014
1002
B
2013
990
C
2014
2030
D
2014
599
$ datamash reverse < input.txt
Count
Year
Sample
1002
2014
A
990
2013
B
2030
2014
C
599
2014
D
#(3)Combining Reverse and Transpose
cat input.txt | datamash reverse | datamash transpose
tac input.txt | datamash reverse | datamash transpose
6. Groupby
# 先使用-t定义冒号为字段分隔符,排序,然后根据第7字段(login shells)分组,最后统计每个login shells有多少users在使用
datamash -t: --sort groupby 7 count 7 < /etc/passwd
# 先使用-t定义冒号为字段分隔符,排序,然后根据第7字段(login shells)分组,最后输出分组键值和以逗号分隔的所有users的列表
cat /etc/passwd | datamash -t: --sort groupby 7 collapse 1
#/bin/bash:root,guest,gordon,charles,alice,bob,postgres
#/bin/false:mysql,rabbitmq,redis,postfix
#/bin/sync:sync
#/usr/sbin/nologin:daemon,bin,sys,games,man,lp,mail,news,uucp,proxy
7. Check
#datamash check 验证输入的表格结构,以确保所有行中字段数量相同,
#这常应用于pipeline中检查数据文件的结构是否完整,因为如果文件结构不完整,则会以non-zero exit code终止,
#并且会输出关于结构不完整行的详细信息。
datamash check < good.txt && echo ok || echo fail
datamash check < bad.txt && echo ok || echo fail
#(1) 预期行数和列数
# 用法:datamash check [N lines] [N fields]
# 说明:当输入文件的行数或列数与指定值不同,则以non-zero exit code终止
datamash check 4 lines < file.txt && echo ok
datamash check 3 fields < file.txt && echo ok
datamash check 4 lines 3 fields < file.txt && echo ok
datamash check 7 fields < file.txt && echo ok
datamash check 10 lines < file.txt && echo ok
# 为了便利,line,row,rows 可以代替lines; field,columns,column,col 可以代替fields.
datamash check 4 lines 10 fields < file.txt
datamash check 4 rows
10 columns < file.txt
datamash check 10 col 4 row < file.txt
#(2) checks in automation scripts
#------------------------------------------
#!/bin/sh
die()
{
base=$(basename "$0")
echo "$base: error: $@" >&2
exit 1
}
custom pipeline-or-program > output.txt
|| die "program failed"
datamash check < output.txt
|| die "'output.txt' has invalid structure (missing fields)"
8. Crosstab
cat input.txt
# a
x
3
# a
y
7
# b
x
21
# a
x
40
#默认使用 count,统计每一对(ax, ay, bx, by)出现的次数
datamash -s crosstab 1,2 < input.txt
#
x
y
# a
2
1
# b
1
N/A
#对第三列求和
datamash -s crosstab 1,2 sum 3 < input.txt
#
x
y
# a
43
7
# b
21
N/A
#列出第三列所有唯一值
datamash -s crosstab 1,2 unique 3 < input.txt
#
x
y
#a
3,40 7
#b
21
N/A
9. Rounding numbers
# 根据不同函数(eg. round/ceil/floor/trunc/frac...)进行约束数值的小数点后N位
( echo X ; seq -1.25 0.25 1.25 ) |
datamash --full -H round 1 ceil 1 floor 1 trunc 1 frac 1
#
X
round(X)
ceil(X)
floor(X)
trunc(X)
frac(X)
# -1.25
-1
-1
-2
-1
-0.25
# -1.00
-1
-1
-1
-1
0
# -0.75
-1
0
-1
0
-0.75
# -0.50
-1
0
-1
0
-0.5
# -0.25
0
0
-1
0
-0.25
#
0.00
0
0
0
0
0
#
0.25
0
1
0
0
0.25
#
0.50
1
1
0
0
0.5
#
0.75
1
1
0
0
0.75
#
1.00
1
1
1
1
0
#
1.25
1
2
1
1
0.25
10. Binning numbers
#Bin input values into buckets of size 5:
( echo X ; seq -10 2.5 10 ) | datamash -H --full bin:5 1
#
X
bin(X)
# -10.0
-15
#
-7.5
-10
#
-5.0
-10
#
-2.5
-5
#
0.0
0
#
2.5
0
#
5.0
5
#
7.5
5
#
10.0
10
11. Binning strings
#将任何字符串输入值哈希(hash)为一个整数。
#典型用法:将一个输入文件分成N个块(chunks), 确保某个键的所有值都存储在同一个块中:
cat input.txt
# PatientA
10
# PatientB
11
# PatientC
12
# PatientA
14
# PatientC
15
# Each patient ID is hashed into a bin between 0 and 9 and printed in the last field:
datamash --full strbin 1 < input.txt
# PatientA
10
5
# PatientB
11
6
# PatientC
12
7
# PatientA
14
5
# PatientC
15
7
# Splitting the input into chunks can be done with awk:
cat input.txt | datamash --full strbin 1 | awk '{print > $NF ".txt"}'
参考链接:https://www.gnu.org/software/datamash/manual/datamash.html
最后
以上就是阳光自行车为你收集整理的datamash 教程的全部内容,希望文章能够帮你解决datamash 教程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复