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