引子
之前写 awk 教程的时候,曾经提到过一些对文本中行列进行某些计算统计的需求,例如使用数组分类求和。一些基本需求 awk 都可以实现,但是写起来稍显复杂。在 R 中使用 dplyr 或者基础函数 aggregate()
可以方便的进行分组操作,如果能在 linux 中使用更加简洁的单行命令针对数值和字符进行一些基本运算就省去了在 R 终端操作的时间。这篇文章介绍一个 linux 中能满足这类需求的工具 GNU datamash。
温馨提示:文章长度可能超出你的耐心,看到哪里看不下去了就先分享朋友圈有机会再慢慢看
。也可以划到文末移步
阅读原文 获得更好阅读体验。
两个使用 awk 的例子如下:
cat awk2.txt
USSR 8649 275 Asia
Canada 3852 25 North_America
China 3705 1032 Asia
USA 3615 237 North_America
Brazil 3286 134 South_America
India 1267 746 Asia
awk '{ pop[$4] += $3 }END{ for (name in pop) print name,pop[name]}' awk2.txt
#North_America 262
#Asia 2053
#South_America 134
例如利用 getline
通过第一列信息判断,将第一列相同的第二列内容合并。
cat awk3.txt
a qw
a we
a wet
b wer
b klj
b piu
c eie
c tmp
c ike
awk 'BEGIN{getline;a=$1;printf ("%s\t%s",$1,$2)}{if(a==$1){printf ","$2}else{printf "\n%s\t%s",$1,$2;a=$1}}END{printf "\n"}' awk3.txt
a qw,we,wet
b wer,klj,piu
c eie,tmp,ike
datamash 是什么
在 gnu 官网 中,用了下面一句话来介绍 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
来进行安装或者通过源码来安装最新版本,这里采用第二种方式。
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)或者将所有行按照一组进行处理。
groupby
:分组等同于--group
或者-g
参数。后面指定用于分组的列crosstab
:类似于 excel 中的数据透视表 Pivot Table,可以按照两列来处理矩阵,默认是计算在 a,b 中出现的次数transpose
:交换行列,转置,等价于 R 中的t()
reverse
:反转字段顺序,交换列check
:验证数据结构,保证每行字段相同