2010-11-17 58 views
1

最大数值我有一个看起来像这样的数据文件:建立哈希散列值来确定红宝石

FBpp0070000 acyr193594273 acyr 866 
FBpp0070000 acyr193577824 acyr 536 
FBpp0070000 acyr193693009 acyr 445 
FBpp0070000 bomb193605819 bomb 503 
FBpp0070000 bomb193676398 bomb 101 
FBpp0070001 acyr193618043 acyr 316 
FBpp0070001 acyr193617997 acyr 313 
FBpp0070001 bomb193638865 bomb 482 
FBpp0070001 locu193695159 locu 220 
FBpp0070001 locu193638863 locu 220 

数据文件是〜45000线长。

我的目标是有这样的:

FBpp0070000 acyr193594273 acyr 866 
FBpp0070000 bomb193605819 bomb 503 
FBpp0070001 acyr193618043 acyr 316 
FBpp0070001 bomb193638865 bomb 482 
FBpp0070001 locu193695159 locu 220 

也就是说,仅保留在第4列得分最高的线路,每个不同的值在第3列,在第1列的每个值。

此外,我看到的问题是1)多重,在第1列和第2列中重复的“键”)等于第4列中的“分数”我只想保留一个重复“分数”的实例。

我在过去在perl中构建了一个可以处理多个重复键的散列。

这是我到目前为止的红宝石。

hash = Hash.new{|h,k| h[k]=Hash.new(&h.default_proc) } 
title = '' 

File.open('test1.txt', 'r').each do |line| 
    line.chomp! 

    query, hit, taxa, score = line.split(/\s/) 
    hash[query][hit][taxa] = score 

# end 

#p "#{query}: #{taxa}: #{score}" 

end 
p hash 

所以,我希望有人可以帮助我判断1)如果我是,事实上,正确的要对此,和2)如果是这样,如何提取我所需要的线。

谢谢。

回答

3

鉴于上面给出的输入示例,以下似乎可以做到你想要的。你需要在最后使用数据来获得你想要的输出格式。

#!/usr/bin/env ruby 

require 'pp' 

data = {} 
File.open("input.txt", "r").each do |l| 
    l.chomp! 
    query, hit, taxa, score = l.split(/\s+/) 
    data[query] ||= {} 
    data[query][taxa] ||= [0, nil] 
    data[query][taxa] = [score.to_i, hit] if score.to_i > data[query][taxa].first 
end 

pp data 

这给:

[email protected]:~/Development/test $ ./out.rb 
{"FBpp0070000"=> 
    {"bomb"=>[503, "bomb193605819"], "acyr"=>[866, "acyr193594273"]}, 
"FBpp0070001"=> 
    {"bomb"=>[482, "bomb193638865"], 
    "locu"=>[220, "locu193695159"], 
    "acyr"=>[316, "acyr193618043"]}} 
+0

DJ2,非常感谢您的帮助!我会弄清楚如何在明天排序。对此,我真的非常感激。 – user511038 2010-11-17 22:10:22