datamash 教程

热爱美食的朋友们,安利我朋友目前正在运营的一个美食餐厅公众号douke_home
也非常欢迎大伙儿前来我朋友餐厅探索美味,这是豆壳餐厅地址:(1) 苏州市姑苏区学士街418号(距苏州地铁1号线养育巷站3号口390m); (2)苏州市姑苏区南新路与西中市交叉口

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字节,而不是换行
 
操作注释

可应用的操作有:

  1. 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: 验证输入的表格结构(确保所有行中字段数量相同)

  1. Line-Filtering operations: rmdup
  • rmdup: 删除具有重复键值的行
  1. 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哈希值

  1. Numeric Grouping operations: sum, min, max, absmin, absmax, range
  • sum: 求和

  • min & max: 最小值 & 最大值

  • absmin & absmax: 最小绝对值 & 最大绝对值

  • range: 数值范围(最大值-最小值)

  1. Textual/Numeric Grouping operations: count, first, last, rand, unique, collapse, countunique
  • count: 分组中元素计数
  • first & last: 分组中的第一个值 & 分组中的最后一个值
  • rand: 分组中的随机值
  • unique: 逗号分隔的唯一值的排序列表
  • collapse: 逗号分隔的所有输入值的列表
  • countunique: 唯一值/不同值的数量
  1. 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 '1\t\t2\n' | datamash sum 3

printf '1\t\t2\n' | cut -f3

# -W 一个或多个连续空格均被当做一个字段分隔符
printf '1  \t  2\n' | datamash -W sum 2

printf '1  \t  2\n' | datamash -W sum 3

# -t, 自定义分隔符
printf '1,10,,100\n' | 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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值