[问题] 区块内取值

楼主: 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