[問題] 區塊內取值

看板Perl作者 (CW)時間10年前 (2014/05/07 01:31), 編輯推噓1(1011)
留言12則, 4人參與, 最新討論串1/1
這是目前我手上的資料內容,因為它的內容很多,而現階段我只要用到其中兩項的資料, 所以試著寫個程式去抓取,結果一直沒辦法達成我想要的目標! 檔案部分內容: 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

05/07 03:15, , 1F
print($1 ? "$1\n" : "\n");
05/07 03:15, 1F

05/07 03:16, , 2F
然後你後面問的問題, 通常是用兩層迴圈, 外層把 ID 截出
05/07 03:16, 2F

05/07 03:16, , 3F
來, 然後內層再處理截出來的內容
05/07 03:16, 3F

05/07 03:17, , 4F
想耍帥才用一個 regex 搞定配 (?{ CODE }) 吃 XD
05/07 03:17, 4F

05/07 09:47, , 5F
不行耶,因為由 DR 開頭的行數不只一行,當它比對不到時,
05/07 09:47, 5F

05/07 09:48, , 6F
就變成輸出 \n ,這樣一來就有很多空行了,該怎麼讓程式
05/07 09:48, 6F

05/07 09:49, , 7F
^^^^打錯
05/07 09:49, 7F

05/07 09:50, , 8F
有沒有辦法能一次針對 DR 開頭的行,一起比對,用"//m" ?
05/07 09:50, 8F

05/07 12:56, , 9F
如果你不介意最上面多一行空行 可以把\n換到Qxx前面
05/07 12:56, 9F

05/10 17:40, , 10F
Good, 感謝各位!
05/10 17:40, 10F

06/01 09:44, , 11F
如果你不嫌麻煩的話﹐可以加一個$flag﹐通過判斷$flag標
06/01 09:44, 11F

06/01 09:45, , 12F
識來決定加\n。
06/01 09:45, 12F
文章代碼(AID): #1JQHnWec (Perl)
文章代碼(AID): #1JQHnWec (Perl)