2011-05-27 47 views
1

我有很多长文件,但我只是在每个人的信息的一部分感兴趣。到目前为止,我有一个修剪文件的代码,并给出了包含我需要的信息的行,当时正在处理一个文件。如何在Perl中选择部分行?

这是我使用的代码:

#!/usr/bin/perl 
use strict; 
use warnings; 
my $data; 

open FILE, "<$ARGV[0]" or die "cannot open file '$ARGV[0]'!\n\n"; 

while ($data= <FILE>){ 
    chomp $data; 

    if($data=~m/\<input type="hidden" name="description" value="454read"><input type="hidden" name="format" value="fasta"><input type="submit" name="submitbutton" value="FASTA"/) 
    { 
     $data=~s/[^ACTGN]//g; 
     print $data; 
    } 
} 

这是输入我得到:

<input type="hidden" name="sequence" value="TTGTTGAGCTCGACGGTCATGACCCAGCTGGAGTCGGCACGGGCACCCGCGCGCTTCTGCCAGACGCCAATGTGGGACTTCTCGGTGTCGAGGC"><input type="hidden" name="name" value="FUY784js_7HL"><input type="hidden" name="description" value="454read"><input type="hidden" name="format" value="fasta"><input type="submit" name="submitbutton" value="FASTA"> 

从此我只需要两个部分,TTGTT .... AGGC,这部分将始终为大写字母A,T,C,G或N,但每个文件的长度可能不同。我也需要保存这个名字,在这种情况下是FUY784js_7HL,这个名字每次都会改变。

理想的输出应该是这样的:

FUY784js_7HL 
TTGTTGAGCTCGACGGTCATGACCCAGCTGGAGTCGGCACGGGCACCCGCGCGCTTCTGCCAGACGCCAATGTGGGACTTCTCGGTGTCGAGGC 

你有我该怎么办任何的想法?我有很多这样的文件。我会很感激,如果你们中的任何人都可以帮我弄清楚如何让这个文件适用于多个文件。

谢谢!

+1

具有样品输入将是有益的 – Zaid 2011-05-27 18:43:59

回答

1
perl -pe 's/[^ACTGN]//g;' 

至于这似乎是有问题的所述位的代理,上述命令似乎工作,至少在开始<input输入线和第二输出线。

如果您的真实程序中没有任何其他打印件,我不确定它如何生成您所说的行。

其实这是一个谎言。我:

TTGTTGAGCTCGACGGTCATGACCCAGCTGGAGTCGGCACGGGCACCCGCGCGCTTCTGCCAGACGCCAATGTGGGACTTCTCGGTGTCGAGGCATA

回来,因为在最后的FASTA价值。如果你想限制的主要价值:

perl -pe 's/.*"([ACTGN]+)".*<input\b[^>]*\bname="name"\s[^>]*\bvalue="([^"]+)".*/$2\n$1/;' 

请注意,所有有关的愚蠢和解析XML的脆弱性与正则表达式的标准免责声明的适用。具体来说,对名称和值属性重新排序是完全合法的,这个示例正则表达式不允许这样做。

+0

你知道我怎么能得到同样的名字“FUY784js_7HL” – Ana 2011-05-27 19:01:08

+0

@Ana:完成,但请阅读光盘雷梅霍夫。 – 2011-05-27 19:09:01

+0

塞斯,你是一个天才!非常感谢!它工作完美!:D – Ana 2011-05-27 19:18:08

0

如果我正确理解问题,它看起来像利用捕获组满足您的需要。特别,因为你知道的开头和结尾,但不知道中间,这样的事情应该工作:

$data =~ /TTGTT(.+)AGGC/; 
print $1; 

检查出的perldoc上捕捉组的部分: http://perldoc.perl.org/perlre.html#Regular-Expressions

+0

这个序列对于每个文件都是不同的,所以实际上我不知道开始和结束。但是,如果我可以分割和打印每一项的条目,例如x =“,那么我不会认为这个字母序列是第三个字母,名字是第6个字母 – Ana 2011-05-27 19:05:45

0

从已贴出来,我想这将返回序列:

$data =~ /name="sequence" value="([AGCT]*).*name="name" value="([^"])"/; 
print "$2\n$1";