请教shell求和方法
有一个文件cat abc
1 10
3 20
1 50
5 20
20 46
5 40
想实现这样的功能:
第一列按照1 3 5 10 20 排序,第二列进行求和.
如果第一列的值不存在,则第二列补充为0.
即最后想要的的结果是:
1 60
3 20
5 60
10 0
20 46
请教怎么解决?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
回复 1# lvyuancyx
请问 一下! 在你第一列中没有的数字,你问什么还要加入啊!
我这写了个第一列没有10的:
echo '1 10
3 20
1 50
5 20
20 46
5 40'|awk '{a[$1]+=$2}END{for(i in a)print i"\t"a}'|sort -n -k 1
1 60
3 20
5 60
20 46
本帖最后由 lvyuancyx 于 2011-04-17 18:04 编辑
回复 2# db2-zhang
因为统计数据中需要10的数据,可能在某一天里却没有这个10的数据.所以要填成0.
我写了一个但是不够精简,所以想求更好的方法
for val in 1 3 5 10 20
do
awk '{print $1}' abc |grep -w $val >/dev/null 2>&1
if [ $? -eq 0 ];then
awk -v vv=$val '{if($1==vv){a[$1]+=$2}}END{for(i in a) print i,a}' abc
else
echo $val 0
fi
done
$ echo '1 10
3 20
1 50
5 20
20 46
5 40' | perl -lane 'BEGIN{$h{$_}=0 for(1,3,5,10,20)}{$h{$F[0]}+=$F[1]}END{for(sort{$a<=>$b}keys %h){print "$_\t$h{$_}"}}'
1 60
3 20
5 60
10 0
20 46
本帖最后由 jason680 于 2011-04-18 11:10 编辑
只用awk的来实现,难真累人....
$ echo '1 10
3 20
1 50
5 20
20 46
5 40 ' |awk 'BEGIN{a["01"]=a["03"]=a["05"]=a[10]=a[20]=0}
{a[sprintf("%02s",$1)]+=$2}
END{n=asorti(a,s);for(t=1;t<=n;t++)printf("%d\t%s\n",s[t],a[s[t]])}'
1 60
3 20
5 60
10 0
20 46
复制代码
回复 1# lvyuancyx
复制代码
这个就应该用蛮力解决,别为了一个特殊情况考虑算法
,直接把第一列必须有的数字追加到文件里,
然后就是求和了
同意楼上的...
学习学习!