[問題] 區塊內取值

作者: chong (CW)   2014-05-07 01:31:09
這是目前我手上的資料內容,因為它的內容很多,而現階段我只要用到其中兩項的資料,
所以試著寫個程式去抓取,結果一直沒辦法達成我想要的目標!
檔案部分內容:
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」之間的內容進行比對嗎?
謝謝
作者: CindyLinz (Cindy Wang)   2014-05-07 03:15:00
print($1 ? "$1\n" : "\n");
作者: CindyLinz (Cindy Wang)   2014-05-07 03:16:00
然後你後面問的問題, 通常是用兩層迴圈, 外層把 ID 截出來, 然後內層再處理截出來的內容
作者: CindyLinz (Cindy Wang)   2014-05-07 03:17:00
想耍帥才用一個 regex 搞定配 (?{ CODE }) 吃 XD
作者: chong (CW)   2014-05-07 09:47:00
不行耶,因為由 DR 開頭的行數不只一行,當它比對不到時,
作者: chong (CW)   2014-05-07 09:48:00
就變成輸出 \n ,這樣一來就有很多空行了,該怎麼讓程式
作者: chong (CW)   2014-05-07 09:49:00
^^^^打錯
作者: chong (CW)   2014-05-07 09:50:00
有沒有辦法能一次針對 DR 開頭的行,一起比對,用"//m" ?
作者: AntaresStar   2014-05-07 12:56:00
如果你不介意最上面多一行空行 可以把\n換到Qxx前面
作者: chong (CW)   2014-05-10 17:40:00
Good, 感謝各位!
作者: hhs66317 (六子)   2014-06-01 09:44:00
如果你不嫌麻煩的話﹐可以加一個$flag﹐通過判斷$flag標識來決定加\n。

Links booklink

Contact Us: admin [ a t ] ucptt.com