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|
要求将以上文本以inode为标记,对counts进行累加,并且统计出beginnumber的最小值和endnumber的最大值:
inode|beginnumber|endnumber|counts|
106|3363120000|3368579999|30000|
310|3337000000|3362120961|10103|
311|3313460102|3362120963|39900|
- awk -F'|' 'NR==1{print;next}{a[$1]?(a[$1]>$2?a[$1]=$2:0):(a[$1]=$2);b[$1]?(b[$1]<$3?b[$1]=$3:0):(b[$1]=$3);c[$1]+=$4}END{l=asorti(a,d);for(i=1;i<=l;i++)print d[i] FS a[d[i]] FS b[d[i]] FS c[d[i]] FS}' file
[解析]
第一行直接打印。从第2行开始以$1为下标,建立3个数组,比较出$2的最小值,$3的最大值,然后把$4进行累加,最后进行排序后依次取出各项值。
这其中运用了三目运算的嵌套,跟我们 if(){if(){}}else{} 的使用是一个道理,不要认为复杂,如果觉得模糊不清,仔细读懂流程控制。
阅读(4600) | 评论(1) | 转发(1) |