awk 练习题 - 数组、最值、总计

将以下文本以inode为标记,对inode相同的counts进行累加,并且统计出同一inode中,beginnumber的最小值和endnumber的最大值。

inode|beginnumber|endnumber|counts|
106|3363120000|3363129999|10000|
106|3368560000|3368579999|20000|
310|3337000000|3337000100|101|
310|3342950000|3342959999|10000|
310|3362120960|3362120961|2|
311|3313460102|3313469999|9898|
311|3313470000|3313499999|30000|
311|3362120962|3362120963|2|

输出的结果格式为:

310|3337000000|3362120961|10103|  
311|3313460102|3362120963|39900|  
106|3363120000|3368579999|30000|

解答:

awk -F'|' -v OFS='|' '/^[0-9]/{inode[$1]++; if(!bn[$1]){bn[$1]=$2}else if(bn[$1]>$2){bn[$1]=$2}; if(en[$1]<$3)en[$1]=$3;cnt[$1]+=$(NF-1)} END{for(i in inode)print i,bn[i],en[i],cnt[i]}' inputfile
[root@centos7 ~]# cat t8 
inode|beginnumber|endnumber|counts|
106|3363120000|3363129999|10000|
106|3368560000|3368579999|20000|
310|3337000000|3337000100|101|
310|3342950000|3342959999|10000|
310|3362120960|3362120961|2|
311|3313460102|3313469999|9898|
311|3313470000|3313499999|30000|
311|3362120962|3362120963|2|
[root@centos7 ~]# awk -F'|' -v OFS='|' '/^[0-9]/{ \
inode[$1]++ \
;if(!bn[$1]){bn[$1]=$2}else if(bn[$1]>$2){bn[$1]=$2} \
;if(en[$1]<$3)en[$1]=$3;cnt[$1]+=$(NF-1)} \
END{for(i in inode)print i,bn[i],en[i],cnt[i]}' t8
310|3337000000|3362120961|10103
311|3313460102|3362120963|39900
106|3363120000|3368579999|30000

猜你喜欢

转载自www.cnblogs.com/haona_li/p/10262513.html
今日推荐