2010-11-17 62 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