Nie jestem programistą, ale chodzę na zajęcia z bioinformatyki, ponieważ jestem specjalistą z genetyki molekularnej... naszym zadaniem jest zebranie pliku wielu wpisów, takich jak ten:

77: XP_001929585
PRZEWIDZIANE: podobne do białka związanego z BRCA1 [Sus scrofa] gi|194042959|ref|XP_001929585.1| [194042959]

I wyodrębnij elementy, które pogrubiłem, a następnie zapisz wyniki w pliku rozdzielanym pionową kreską, takim jak ten:

194042959|Sus scrofa|PREDICTED: similar to BRCA1 associated protein.

Używamy edytora Sublime do pisania naszych skryptów w Ruby. Wiem jak otworzyć plik, a potem... cóż, oto mój skrypt na razie...

#!/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

Wiem, że to źle... wyrażenia regularne rejestrują to, czego potrzebują. pierwsze wstawienia poprawnie podają nazwę i opis taksonu, ale nie umiem wymyślić, jak umieścić tam numer gi, ponieważ jest on w innej linii... Mogę samodzielnie pobrać numer gi również, ale nie ma możliwości powiązania go z pozostałymi dwiema częściami. Ponadto, kiedy wyciągam je za pomocą opracowanych przeze mnie wyrażeń regularnych, pozostają one w odpowiedniej kolejności, tak jak w pliku, więc próbowałem wymyślić sposób, aby powiedzieć komputerowi, aby polubił każdą parę nazwa/opis taksonu 1 , 2, 3, itd. jak w pliku, a następnie zrób to samo z numerami gi, a potem możesz po prostu powiedzieć, że nazwa/opis taksonu 1 idzie w parze z numerem gi 1, itd... lub niech komputer pobierze takson para nazwa i opis, a następnie spójrz w następnym wierszu na numer gi, ale nie wiem, jak to zrobić ...

Wsparcie? Przydałby się też prosty język angielski, większość witryn pomocy, z których mógłbym korzystać, ale po prostu nie rozumiem języka ...

Pierwsze 4 wpisy:

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]
1
kbearski 17 luty 2012, 10:49

2 odpowiedzi

Najlepsza odpowiedź

Czy linie zawsze przychodzą parami?

Jeśli tak, dlaczego nie:

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
0
Edu 17 luty 2012, 11:05

Masz na myśli to?

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

Myślę, że jeśli masz nadzieję na dokładność i sprawdź "XP_001929585".

0
kachick 17 luty 2012, 17:18