每个哈希键的多个值

时间:2013-09-02 13:00:01

标签: ruby hash

以下是我用于脚本的文件的摘录:

host1 10000000c9c5acfa
host1 10000000c9fc168c
host2 10000000c9c5fb32
host2 10000000c9fc1682
host1 10000000c9c5bf4e
host1 10000000c9fc168d
host3 10000000c9534d61
host3 10000000c9534ffe
host3 10000000c9534d61
host3 10000000c9534ffe

我正在努力创建一个哈希或数组(不确定在这种情况下哪个更好),以便我有以下格式

host1 10000000c9c5acfa,10000000c9fc168c,10000000c9c5bf4e,10000000c9fc168d
host2 10000000c9c5fb32,10000000c9fc1682
host3 10000000c9534d61,10000000c9534ffe

我希望主机能够在一行中显示所有WWN,但有时主机有一个WWN,有时两个,有时四个。知道如何在这里形成哈希/数组吗?

3 个答案:

答案 0 :(得分:0)

你是对的:你需要哈希。这段代码演示了。

在文件的每一行上调用split将其划分为以空格分隔的字段。对应于主机的哈希元素设置为空数组(如果它尚不存在),则将新代码推送到它上面。

通过按主机名称的排序顺序转储哈希值,并将uniq应用于相应代码列表来生成输出。

open('myfile', 'r') do |f|

  data = {}

  f.each_line do |line|
    host, code = line.split
    data[host] ||= []
    data[host] << code
  end

  data.keys.sort.each do |host|
    puts "#{host} #{data[host].uniq.join(',')}"
  end

end

<强>输出

host1 10000000c9c5acfa,10000000c9fc168c,10000000c9c5bf4e,10000000c9fc168d
host2 10000000c9c5fb32,10000000c9fc1682
host3 10000000c9534d61,10000000c9534ffe

答案 1 :(得分:-1)

这样可行 - 请在每个值中添加一些修复以删除最后一个',':

h = {}
lines = File.readlines("a.txt")
lines.each { |line| 
  line = line.chomp
  key,value = line.split(" ")
  if(!h.has_key?(key)) 
    h[key] = ""
  end
  h[key] = h[key] + value + ","
}
print h

答案 2 :(得分:-1)

我会创建一个Hashhost ⇒ Array[WWN]对:

h = {}
File.open("a.txt").each { |l|
  k,v = l.split(' ')
  (h[k] ||= []) << v
}
p h

 # ⇒ {
 # ⇒   "host1" => ["10000000c9c5acfa", "10000000c9fc168c", "10000000c9c5bf4e", "10000000c9fc168d"], 
 # ⇒   "host2" => ["10000000c9c5fb32", "10000000c9fc1682"], 
 # ⇒   "host3" => ["10000000c9534d61", "10000000c9534ffe", "10000000c9534d61", "10000000c9534ffe"]
 # ⇒ }