我不是程序员,但我正在参加生物信息学课程,因为我是一名分子遗传学专业...我们的任务是获取一个包含多个条目的文件:
77:XP_001929585
预测:与BRCA1相关蛋白相似 [ Sus scrofa ] GI |的 194042959 | REF | XP_001929585.1 | [194042959]
并提取我加粗的项目,然后将结果保存到以管道分隔的文件中:
194042959|Sus scrofa|PREDICTED: similar to BRCA1 associated protein.
我们正在使用Sublime编辑器在Ruby中编写脚本。我知道如何打开文件然后......好吧,到目前为止这是我的脚本......
#!/usr/local/bin/ruby
File.open("mmg231_hw5_brca1.txt").each do |file_line|
if file_line =~ /^(.+)\[([A-Z].+)\]/
description = $1
taxon_name = $2
puts "#{taxon_name}|#{description}"
elsif file_line =~ /\[([0-9].+)\]/
gi_number = $1
puts "#{gi_number}"
end
end
我知道这是错的......正则表达式确实捕获了他们需要的内容。第一次推出确实正确地推出了分类名称和描述,但是我无法弄清楚如何在那里得到gi号码,因为它在另一条线上...我可以自己拿出gi号码另外,但无法将其与其他两个部分联系起来。此外,当我使用我开发的正则表达式将它们拉出来时,它们保持在文件中的正确顺序,所以我试图想办法告诉计算机每个分类单元名称/描述对1的编号,如文件中的2,3等,然后用gi编号做同样的事情,然后你可以说像分类名称/描述1与gi编号1等...或者让计算机获得分类名称和描述对,然后只看下一行的gi号,但我不知道怎么做...
帮助?用简单的英语会很有帮助,大多数帮助网站我觉得我可以使用,但我只是不懂语言......
前4个条目:
1: ZP_00239925
BRCA1 [Bacillus cereus G9241]
gi|47569239|ref|ZP_00239925.1||gnl|WGS:NZ_AAEK|BCE_G9241_3679 [47569239]
2: NP_009225
breast cancer 1, early onset isoform 1 [Homo sapiens]
gi|6552299|ref|NP_009225.1| [6552299]
3: NP_033894
breast cancer 1 [Mus musculus]
gi|161016835|ref|NP_033894.3| [161016835]
4: NP_036646
breast cancer 1 [Rattus norvegicus]
gi|6978573|ref|NP_036646.1| [6978573]
答案 0 :(得分:0)
线条总是成对出现吗?
如果是这样,为什么不这样做:
description = taxon_name = gi_number = nil
first = false
File.open("mmg231_hw5_brca1.txt").each do |file_line|
if file_line =~ /^(.+)\[([A-Z].+)\]/
description = $1
taxon_name = $2
first = true #Just to check they are consecutive
else
if file_line =~ /\[([0-9].+)\]/
gi_number = $1
if first == true
puts "#{gi_number}|#{taxon_name}|#{description}"
end
end
first = false
end
end
答案 1 :(得分:0)
你的意思是这样吗?
description, taxon_name = nil, nil
STDIN.each do |line|
case line
when /^(.+?\: .+) \[(.+?)\]$/
description, taxon_name = $1, $2
when /^.+?\|(\d+)\|\w+\|/
gi_number = $1
puts "#{gi_number}|#{taxon_name}|#{description}."
end
end
我想,如果你希望准确并检查“XP_001929585”。