以下是我用于脚本的文件的摘录:
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,有时两个,有时四个。知道如何在这里形成哈希/数组吗?
答案 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)
我会创建一个Hash
对host ⇒ 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"]
# ⇒ }