找回密码
 立即注册
Qt开源社区 门户 查看内容

linux 极简统计分析工具 datamash 必看教程

2019-6-29 09:13| 发布者: admin| 查看: 1794| 评论: 0

摘要: 更多精彩,请点击上方蓝字关注我们!datamash 是什么在官网中,用了下面一句话来介绍 datamash。GNU datamash is a command-line program which performs basic numeric, textual and statistical operations on inp ...

更多精彩,请点击上方蓝字关注我们!


datamash 是什么


在官网 中,用了下面一句话来介绍 datamash。

GNU datamash is a command-line program which performs basic numeric, textual and statistical operations on input textual data files.

datamash 作为一个命令行程序可以对文本文件进行数字和文本相关的基本统计操作(虽说基本但是所有的操作都足够常用高频)。

使用前首先进行安装,可以通过 sudo apt-get install datamash 来进行安装,但apt库里软件版本有些老旧,仅为1.0.7。

或者通过源码来安装最新版本,这里采用第二种方式。
wget https://ftp.gnu.org/gnu/datamash/datamash-1.4.tar.gz
tar -xzf datamash-1.4.tar.gz
cd datamash-1.4
./configure
make
make check
sudo make install

调用格式与参数


datamash 的基本调用格式如下:
datamash [option]… op1 column1  [op2 column2 …]

上面的内容转换为描述语言就是:在 option 的参数下,对 column1 列进行 op1 操作,对 column2 列进行 op2 操作。如果使用 --group 参数,所有的 operation 都将会分组进行;如果没有使用 --group,所有的 operation 会对所有的值进行。需要说明的是这里的 column1 可以是表示第几列的数字,当使用 -H 或者 --header-in 时可以是所选字段的名称,可以使用列名,当 operation 要求输入成对数据的时候使用: 连接,比如 spearson 5:6

主要 operation


不同版本支持的参数不同,以下参数适用于 v1.4 版本。在分组统计相关的参数中,p/s 前缀分别代表 population 或者 sample。一般而言,sample 对应的计算等同于 R 中对应函数,例如 sstdev 和 sd() 是一致的。

Primary operations:

primary operations 决定了文件将被如何处理,如果 primary operatino 没有设置,整个文件将会被逐行处理(针对 per-line operation)或者将所有行按照一组进行处理。









操作示例


使用软件自带的测试数据集 scores_h.txt,有三列,分别是学生姓名科目和成绩。
cat /usr/local/share/datamash/examples/scores_h.txt |head
Name    Major   Score
Shawn   Arts    65
Marques Arts    58
Fernando        Arts    78
Paul    Arts    63
Walter  Arts    75
Derek   Arts    60
Nathaniel       Arts    88
Tyreque Arts    74
Trevon  Arts    74

文本基本操作

#检查行列完整性
$ cat scores_h.txt |datamash check

84 lines, 3 fields

# 交换列顺序
$ cat scores_h.txt |datamash reverse |head -n5

Score   Major   Name
65      Arts    Shawn
58      Arts    Marques
78      Arts    Fernando
63      Arts    Paul

# 根据前两列构建透视表,且显示分数
$ cat scores_h.txt |datamash --header-in crosstab 1,2 unique 3 |head

# 因为这个文件有 header 所以需要使用 --header-in 参数
    Arts    Business        Engineering     Health-Medicine Life-Sciences   Social-Sciences
Aaron   N/A     83      N/A     N/A     58      N/A
Allen   N/A     N/A     N/A     N/A     50      N/A
Andre   N/A     N/A     N/A     72      N/A     N/A
Angel   N/A     N/A     N/A     100     N/A     N/A
Anthony N/A     N/A     N/A     N/A     32      N/A
Antonio N/A     N/A     88      N/A     N/A     N/A
Austin  N/A     N/A     N/A     N/A     91      N/A
Avery   N/A     N/A     51      N/A     N/A     N/A
Brandon N/A     N/A     N/A     N/A     72      N/A

分组统计操作


统计每门课的选课人数
$ datamash --header-in --sort groupby 2 count 2 < scores_h.txt
Arts    19
Business        11
Engineering     13
Health-Medicine 13
Life-Sciences   12
Social-Sciences 15

查看每门课程的最高分和最低分,在这里使用 --header-out 输出时会自动添加列名
$ datamash --header-in --header-out --sort groupby 2  min 3 max 3 < scores_h.txt
GroupBy(Major)  min(Score)      max(Score)
Arts    46      88
Business        79      94
Engineering     39      99
Health-Medicine 72      100
Life-Sciences   14      91
Social-Sciences 27      90

因为这是有列名的输入文件,使用 --header-in 参数后可以使用列名来进行计算。统计每门课程的平局分和标准差,在显示的结果中要求只保留两位小数即可。
$ datamash --header-in --header-out --sort -R 2 \
groupby 2  mean Score pstdev Score < scores_h.txt

GroupBy(Major)  mean(Score)     pstdev(Score)
Arts    68.95   10.14
Business        87.36   4.94
Engineering     66.54   19.10
Health-Medicine 90.62   8.86
Life-Sciences   55.33   19.73
Social-Sciences 60.27   16.64

如果想要对文本中的数字进行简化,可以使用如下几个命令:
$ (echo num; seq -1.25 0.25 1.25) \
|datamash --full -H round 1 ceil 1 floor 1 trunc 1 frac 1

num     round(num)      ceil(num)       floor(num)      trunc(num)      frac(num)
-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

在实际的服务器管理中,可能需要统计一些系统用户信息。这些信息存放在 /etc/passwd 中,: 分割。这里使用 login shells 进行分组,然后统计用户数。
$ cat /etc/passwd | datamash -t : --output-delimiter $'\t' --sort groupby 7 count 7

/bin/bash       10
/bin/false      22
/bin/sh 3
/bin/sync       1
/usr/sbin/nologin       17



END


碧茂课堂精彩课程推荐:

1.Cloudera数据分析课;

2.Spark和Hadoop开发员培训;

3.大数据机器学习之推荐系统;

4.Python数据分析与机器学习实战;



详情请关注我们公众号:碧茂大数据-课程产品-碧茂课堂

现在注册互动得海量学币,大量精品课程免费送!




关注最新行业动态,

加群进行技术交流!


----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:碧茂大数据,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

鲜花

握手

雷人

路过

鸡蛋

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了