2012-02-17 67 views
1

我不是程序員,但我正在參加生物信息學課,因爲我是分子遺傳學專業......我們的任務是獲取多個條目是這樣的:從文件中提取文本並將結果保存到管道分隔文件中

77:XP_001929585
PREDICTED:類似於BRCA1相關蛋白 [野豬] GI | | ref | XP_001929585.1 | [194042959]

,並提取我加粗的項目,然後把結果保存到一個管道分隔的文件是這樣的:

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

我們正在使用的崇高編輯器來編寫我們的腳本在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

我認爲如果你展示更多的輸入文件的例子會有所幫助。 – Phrogz 2012-02-17 06:57:40

+0

您可以使用3個不同的條目發佈'mmg231_hw5_brca1.txt'的例子嗎?以MB爲單位的輸入文件有多大,以及將來如何使用大文件作爲輸入? – 2012-02-17 07:57:09

+0

我添加了前4項 - 其中有4328項... – kbearski 2012-02-18 17:57:53

回答

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 2012-02-18 17:48:20

+0

您遇到的問題是您的文件的一行中有部分數據,而下一行中有部分數據。所以,我所做的就是從第一行保留descriptio和taxon_name,並添加一個布爾變量來指示第一行被讀取。然後循環讀取另一行,我檢查它是否匹配第一行,它不會,如果它匹配第二個我得到gi_number並打印所有數據。 – Edu 2012-02-19 08:53:55

+0

好的,太棒了!謝謝! – kbearski 2012-02-20 17:25:15

0

你的意思是這樣嗎?

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」。

相關問題