Ruby 请教一个 Ruby 的 Awk 替代-[行和列处理]

devops · 2014年11月25日 · 最后由 luikore 回复于 2014年11月26日 · 2031 次阅读

有 txt 文本格式为 SynLovely 1 SynLovely 1 SynLovely 1 SynLovely 1 SynLovely 1 SynLovely 1 Crifer 1 Crifer 0 Crifer 0 odinsrage 0 Kronar 1 Kronar 1 Kronar 1 Kronar 1 Kronar 1 Kronar 1 Kronar 1 Kronar 1 psycho 1

.....

有差不多三万多行,规则是这样的,前面是玩家,后面是玩家玩的场地,场地有三种,标识 0、1 和 2,玩的场地不同,得到的积分不同,目的是统计所有玩家的积分,然后排序。积分对应关系是这样的: 0 --- 1 分 1 --- 2 分 2 --- 5 分 比如 Crifer 的积分就是一个 1 和两个 0,得分:1x2+2x1=4。我是用 Awk 解决的,代码:

awk '{if($2==1){$2=2}else if($2==0){$2=1}else if($2==2){$2=5};a[$1]+=$2}END{for (i in a){print i,a[i]}}' num | sort -k2 -n -r | head -n 10

KiwiGirl 1009
SynLovely 990
odinsrage 981
....

求大神讲一下用 Ruby 怎么撸?我是 Ruby 新手,一直都在学基础,没接触到文本处理方面,如果能推荐相关的学习资源,就更好了。 小弟感激不尽哈~~

%x{awk '{if($2==1){$2=2}else if($2==0){$2=1}else if($2==2){$2=5};a[$1]+=$2}END{for (i in a){print i,a[i]}}' num | sort -k2 -n -r | head -n 10}
ruby -ane 'BEGIN{$r = Hash.new 0}; $r[$F[0]] += [1,2,5][$F[1].to_i]; END{puts $r.sort_by(&:last).reverse.take(10).map{|k,v| "#{k} #{v}"}}'

#1 楼 @hhuai 大汗~~~....cmd

#2 楼 @luikore 给力!!!好复杂,学习了,短短一条语句让我学习了很多呢,非常感谢!

#2 楼 @luikore 犀利啊,学习了 :plus1:

#4 楼 @devops 对了 ruby -h 可以看到那些命令行参数都是干嘛的

需要 登录 后方可回复, 如果你还没有账号请 注册新账号