看板 Perl 關於我們 聯絡資訊
這是目前我手上的資料內容,因為它的內容很多,而現階段我只要用到其中兩項的資料, 所以試著寫個程式去抓取,結果一直沒辦法達成我想要的目標! 檔案部分內容: ID 108_SOLLC Reviewed; 102 AA. AC Q43495; DT 15-JUL-1999, integrated into UniProtKB/Swiss-Prot. DR PIR; S26409; S26409. DR RefSeq; XP_004228450.1; XM_004228402.1. DR EnsemblPlants; Solyc01g009590.2.1; Solyc01g009590.2.1; Solyc01g009590.2. DR GeneID; 544145; -. ID 109_SOLLC Reviewed; 102 AA. AC Q43400; DT 15-JUL-1999, integrated into UniProtKB/Swiss-Prot. DR RefSeq; XP_004228450.1; XM_004228402.1. DR RefSeq; XP_004228451.1; XM_004228403.1. DR UniGene; Les.3896; -. DR KEGG; sly:544145; -. ID 110_SOLLC Reviewed; 102 AA. AC Q43499; DT 15-JUL-1999, integrated into UniProtKB/Swiss-Prot. DR RefSeq; XP_004228450.1; XM_004228402.1. DR RefSeq; XP_004228451.1; XM_004228403.1. DR EnsemblPlants; Solyc01g009999.2.1; Solyc01g009999.2; DR UniGene; Les.3896; -. DR KEGG; sly:544145; -. 這是我試著寫的程式碼: #!/usr/bin/env -perl -w open my $file, "<", @ARGV; while (<$file>) { if (/^AC/) { $_ =~ /(\w{6})/; print "$1\t" if ($1); } if (/^DR/) { $_ =~ /(Solyc\w+\.\d)/; print "$1\n" if ($1); } } close $uniprot; 上述程式碼輸出的結果會像這樣: Q43495 Solyc01g009590.2 Q43400 Q43999 Solyc01g009999.2 可是我想排出來的樣式是: Q43495 Solyc01g009590.2 Q43000 Q43999 Solyc01g009999.2 如果我把加了一個判斷式在裡面,沒有比對到的部分就會變成空白行 :( if (/^DR/) { $_ =~ /(Solyc\w+\.\d)/; print ($1) ? "$1\n" : "\n"; } 請問,我該如何修改它,才能輸出成我想要的格式?謝謝 另外想問個問題,我在書上看到能進行多行的比對, 但書上的例子是整個內容一起比, 像上面的例子,可以看出來它是由「ID」開頭的一行做為一個段落的起點, 然後接著數目不定的行數, 下一個「ID」才是另一個段落的開始。 我能夠只針對兩個「ID」之間的內容進行比對嗎? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.117.184.134 ※ 文章網址: http://www.ptt.cc/bbs/Perl/M.1399397472.A.A26.html
CindyLinz:print($1 ? "$1\n" : "\n"); 05/07 03:15
CindyLinz:然後你後面問的問題, 通常是用兩層迴圈, 外層把 ID 截出 05/07 03:16
CindyLinz:來, 然後內層再處理截出來的內容 05/07 03:16
CindyLinz:想耍帥才用一個 regex 搞定配 (?{ CODE }) 吃 XD 05/07 03:17
chong:不行耶,因為由 DR 開頭的行數不只一行,當它比對不到時, 05/07 09:47
chong:就變成輸出 \n ,這樣一來就有很多空行了,該怎麼讓程式 05/07 09:48
chong: ^^^^打錯 05/07 09:49
chong:有沒有辦法能一次針對 DR 開頭的行,一起比對,用"//m" ? 05/07 09:50
AntaresStar:如果你不介意最上面多一行空行 可以把\n換到Qxx前面 05/07 12:56
chong:Good, 感謝各位! 05/10 17:40
hhs66317:如果你不嫌麻煩的話﹐可以加一個$flag﹐通過判斷$flag標 06/01 09:44
hhs66317:識來決定加\n。 06/01 09:45