基本上我有这些文件(来自NCBI的medline)。每个都与期刊标题相关联。每个都有0个,1个或更多个genbank标识号(GBID)。我可以将每个文件的GBID数量与每个日志名称相关联。我的问题是我可能有多个文件与同一个日志关联,我不知道如何将每个文件的GBID数量添加到每个日志的GBID总数中。
我目前的代码: jt代表期刊标题,从文件中正确拉出。 GBID将被添加到遇到的计数中。
......到目前为止,第一次搜索已经完成,你可以想到每个“pmid” 作为单个文件,所以每次“提取”一次一个地遍历所有文件......
pmid_list.each do |pmid|
ncbi_fetch.pubmed(pmid, "medline").each do |pmid_line|
if pmid_line =~ /JT.+- (.+)\n/
jt = $1
jt_count = 0
jt_hash[jt] = jt_count
ncbi_fetch.pubmed(pmid, "medline").each do |pmid_line_2|
if pmid_line_2 =~ /SI.+- GENBANK\/(.+)\n/
gbid = $1
jt_count += 1
gbid_hash["#{gbid}\n"] = nil
end
end
if jt_count > 0
puts "#{jt} = #{jt_count}"
end
end
end
end
我的结果:
Your search returned 192 results.
Virology journal = 8
Archives of virology = 9
Virus research = 1
Archives of virology = 6
Virology = 1
基本上,如何让它说病毒学档案= 15,但是对于任何期刊的头衔?我尝试了一个哈希,但病毒学的第二个档案只是覆盖了第一个......有没有办法让两个键在哈希中添加它们的值?
完整代码:
#!/usr/local/bin/ruby
require 'rubygems'
require 'bio'
Bio::NCBI.default_email = 'kepresto@uvm.edu'
ncbi_search = Bio::NCBI::REST::ESearch.new
ncbi_fetch = Bio::NCBI::REST::EFetch.new
print "\nQuery?\s"
query_phrase = gets.chomp
"\nYou said \"#{query_phrase}\". Searching, please wait..."
pmid_list = ncbi_search.search("pubmed", "#{query_phrase}", 0)
puts "\nYour search returned #{pmid_list.count} results."
if pmid_list.count > 200
puts "\nToo big."
exit
end
gbid_hash = Hash.new
jt_hash = Hash.new(0)
pmid_list.each do |pmid|
ncbi_fetch.pubmed(pmid, "medline").each do |pmid_line|
if pmid_line =~ /JT.+- (.+)\n/
jt = $1
jt_count = 0
jt_hash[jt] = jt_count
ncbi_fetch.pubmed(pmid, "medline").each do |pmid_line_2|
if pmid_line_2 =~ /SI.+- GENBANK\/(.+)\n/
gbid = $1
jt_count += 1
gbid_hash["#{gbid}\n"] = nil
end
end
if jt_count > 0
puts "#{jt} = #{jt_count}"
end
jt_hash[jt] += jt_count
end
end
end
jt_hash.each do |key,value|
# if value > 0
puts "Journal: #{key} has #{value} entries associtated with it. "
# end
end
# gbid_file = File.open("temp_*.txt","r").each do |gbid_count|
# puts gbid_count
# end
答案 0 :(得分:3)
在顶部某处声明jt_hash以零开始:
jt_hash = Hash.new(0)
然后,在:
之后 puts "#{jt} = #{jt_count}"
把:
jt_hash[jt] += jt_count
这使得jt_count在散列中递增,而不是被覆盖。这将打印出所有内容,所以你会得到类似的东西:
Your search returned 192 results.
Virology journal = 8
Archives of virology = 9
Virus research = 1
Archives of virology = 15
Virology = 1
如果你想让所有东西都只打印一次,只需在通过jt_hash的末尾放一些东西并打印所有东西:
jt_hash.each { |elem|
puts "#{elem[1]} = #{elem[0]}"
}