aaa 1
aaa 3
ccc 12
aaa 8
bbb 89
ccc 16
eee 12
ccc 11
eee 13
fff 16
ddd 56
要求对以上文本按第一列的名称进行第2列的求和,并且按升序排列打印。
- awk '{a[$1]+=$2}END{for(i in a){print i,a[i]}}' file
- aaa 12
- ccc 39
- eee 25
- bbb 89
- ddd 56
- fff 16
[解析]
把$1为下标,把$2的值累加到以$1为下标的数组a的值上,然后用for(i in a)这最普通的常用的方式取出数组中的下标和其对应的值,但是这种方式是随机取出的。怎么能达到升顺输出呢?我们看下面的例子。
- awk '{a[$1]+=$2}END{l=asorti(a,b);for(i=1;i<=l;i++){print b[i],a[b[i]]}}' file
- aaa 12
- bbb 89
- ccc 39
- ddd 56
- eee 25
- fff 16
[解析]
第一部分操作和上句一样,只是后面增加了awk的内置排序的函数asorti,然后通过for循环顺序依次取出a数组的下标和对应的值。
评论