2012-02-17 3 views
1

저는 프로그래머가 아니지만 제가 분자 유전학 전공 인 생물 정보학 수업을 듣고 있습니다 ... 우리의 과제는 이런 여러 항목 :파일에서 텍스트를 추출하고 결과를 파이프로 구분 된 파일에 저장하십시오.

77 XP_001929585
예측 : BRCA1 회합 단백질 [SUS scrofa] GI 유사한 | | ref | XP_001929585.1 | [194042959]

내가 굵은 한 항목을 추출,이 같은 파이프로 구분 된 파일에 결과를 저장 : 우리는 우리의 스크립트를 작성하는 숭고한 편집기를 사용하는

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

루비에서. 나는

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

내가 잘못 알고 ... 정규 표현식은에 필요한 캡처 할 ... 파일을 열고 ... 음, 여기 내 스크립트가 지금까지의 방법을 알고있다. 첫 번째 puts는 taxon 이름과 설명을 적절히 표시하지만, 다른 행에있는 것처럼 gi number도 가져 오는 방법을 알아낼 수는 없습니다 ... 자체적으로 gi number를 꺼낼 수 있습니다. 또한 다른 두 부분에 연결하는 방법이 없습니다. 또한 내가 개발 한 정규 표현식을 사용하여 파일을 풀 때, 파일에있는대로 올바른 순서로 머물러 있기 때문에 컴퓨터에 각 분류 이름/설명 쌍 1과 같은 번호를 알려주는 방법을 생각하려고했습니다. , 2, 3 등을 파일에서와 같이 입력 한 다음 gi 번호와 동일하게 입력하면 분류법 이름/설명 1이 GI 번호 1 등과 같이 표시되거나 컴퓨터가 분류군을 가져 오도록 설정할 수 있습니다 이름과 설명 쌍을 입력 한 다음 다음 줄에있는 전화 번호를 살펴보십시오. 그러나이 작업을 수행하는 방법을 모르겠습니다 ...

help? 그리고 ...

처음 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

입력 파일 예제를 더 많이 보여 주면 도움이 될 것이라고 생각합니다. – Phrogz

+0

'mmg231_hw5_brca1.txt'의 예를 3 가지 항목으로 게시 할 수 있습니까? 입력 파일의 크기 (메가 바이트)와 미래에 큰 파일이 입력으로 사용될 가능성이 얼마나됩니까? –

+0

처음 4 개의 항목을 추가했습니다. 그 중 4328 개가 있습니다 ... – kbearski

답변

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 
+0

위대한! 정말 고마워! 너무 많이 물어 보지 않으면, 당신이 한 일의이면에있는 논리를 설명 할 수 있습니까? – kbearski

+0

직면 한 문제는 파일의 한 줄에 데이터의 일부가 있고 다음 줄에 부분이 있다는 것입니다.그래서, 내가 한 것은 첫 번째 줄에서 descriptio와 taxon_name을 유지하고, 첫 번째 줄을 읽었 음을 나타내는 부울 변수를 추가하는 것입니다. 그런 다음 루프가 다른 행을 읽고 첫 번째 행과 일치하는지 확인합니다. 두 번째 행과 일치하면 gi_number를 가져 와서 모든 데이터를 인쇄합니다. – Edu

+0

좋습니다. 고맙습니다! – kbearski

0

은이 같은 뜻? 당신이 "XP_001929585"을 확인 정확성을 희망하는 경우

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 

가 나는 것 같아요.

관련 문제