Извлеките текст из файла и сохраните результаты в файле с разделителями. - PullRequest
1 голос
/ 17 февраля 2012

Я не программист, но я учусь на уроке биоинформатики, поскольку я - специалист по молекулярной генетике ... Наше задание состоит в том, чтобы взять файл из нескольких записей, например:

77: XP_001929585
ПРОГНОЗИРУЕТСЯ: аналогичен белку, связанному с BRCA1 [ Sus scrofa ] ГИ | 194042959 | исх | 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]

Ответы [ 2 ]

0 голосов
/ 17 февраля 2012

Вы имеете в виду, как это?

http://ideone.com/MGW3Z

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"

0 голосов
/ 17 февраля 2012

Всегда ли линии идут парами?

Если так, то почему бы не сделать:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...