作者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/cn.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