awk-处理文件分组统计,分组求和、取最大最小值,取最大最小记录

一、分组求和并排序
1.存在文件groupsum.txt原始数据如下,对下面的文件根据第四列进行分组,并对1,2,3列进行求和。
0.2  0.3  0.5    1
0.3  0.1   0.2   3
0.4  0.2   0.3   1
0.2  0.2   0.2    2
0.3  0.3   0.3    2
0.3   0.2   0.6   3
0.1   0.1   0.1   4
原始数据如上统计为如下这个样子:
0.6 0.5 0.8 1
0.5 0.5 0.5 2
0.6 0.3 0.8 3
0.1 0.1 0.1 4

实现逻辑:
对每一列简历一个数据,数组下标为第四列的值,当出现重复值时对其进行求和;处理完成之后再END中输出。
实现方法:
awk '{a[$4]+=$1;b[$4]+=$2;c[$4]+=$3}END{for(i in a)print a[i],b[i],c[i],i}' groupsum.txt

对上述文件,根据第四列进行分组,并对1,2,3列进行求和,并根据第四列进行倒叙排列。
awk '{a[$4]+=$1;b[$4]+=$2;c[$4]+=$3}END{for(i in a)print a[i],b[i],c[i],i}' groupsum.txt |sort -k4nr

对上述文件, 根据第四列进行分组,并对1,2,3列进行求和,并根据第一列进行倒叙,第二列正序输出
awk '{a[$4]+=$1;b[$4]+=$2;c[$4]+=$3}END{for(i in a)print a[i],b[i],c[i],i}' groupsum.txt |sort -k1nr -k2n

二、有如下文件,roleid,serverid分组,取出每个角色最后一次登录时的记录
文件last_login 中包含roleid    serverid    logintime    level四个字段,文件具体内容如下:
1001    1    2018-01-01 21:00:02    10
1002    2    2008-01-02 22:01:02    11
1001    1    2018-01-01 20:58:01    9
1001    2    2018-01-01 21:01:02    12
awk -F"\t" '{if($3>a[$1$2]) {a[$1$2]=$3;b[$1$2]=$0}}END{for(i in b) print b[i]}' last_login.txt

三、分组统计
还以last_login.txt 为例,以roleid和serverid分组,统计出现次数。

awk -F "\t" '{a[$1][$2]=a[$1][$2]+1}END{for (i in a) {for (j in a[i]) print i,j,a[i][j]}}' last_login.txt

四、取最后一行
还是以last_login.txt 为例,以roleid和serverid分组,查询每个角色的最后一条记录
awk -F "\t" '{if (a[$1][$2] >$3 ||a[$1][$2]=="") a[$1][$2]=$0}END{for (i in a) {for (j in a[i]) print i,j,a[i][j]}}' last_login.txt


你可能感兴趣的:(awk-处理文件分组统计,分组求和、取最大最小值,取最大最小记录)