问题描述
|
我有很多长文件,但我只对每个文件的部分信息感兴趣。到目前为止,我有一个修剪文件的代码,并为我提供了包含所需信息的行,当时只处理一个文件。
这是我正在使用的代码:
#!/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
您是否知道我该怎么办?我有很多这样的文件。如果您能帮助我弄清楚如何使它适用于多个文件,我将不胜感激。
谢谢!
解决方法
perl -pe \'s/[^ACTGN]//g;\'
作为似乎有问题的位的代理,以上命令似乎有效,至少对于以<input
开头的输入行和第二条输出行有效。
如果您的实际程序中没有任何其他打印件,那么我不确定它如何产生您所说的行。
实际上,那是一个谎言。我有:
TTGTTGAGCTCGACGGTCATGACCCAGCTGGAGTCGGCACGGGCACCCGCGCGCTTCTGCCAGACGCCAATGTGGGACTTCTCGGTGTCGAGGCATA
由于末尾的FASTA值而返回。如果要限制为主要值:
perl -pe \'s/.*\"([ACTGN]+)\".*<input\\b[^>]*\\bname=\"name\"\\s[^>]*\\bvalue=\"([^\"]+)\".*/$2\\n$1/;\'
请注意,有关使用正则表达式解析XML的愚蠢和脆弱性的所有标准免责声明均适用。具体来说,重新命名名称和值属性是完全合法的,而此示例regex不允许这样做。
, 如果我正确理解了该问题,则似乎可以利用捕获组来满足您的需求。特别是因为您知道开始和结束但不知道中间,所以这样的事情应该起作用:
$data =~ /TTGTT(.+)AGGC/;
print $1;
在perldoc上查看有关捕获组的部分:
http://perldoc.perl.org/perlre.html#Regular-Expressions
, 从已经发布的内容来看,我认为这将返回序列:
$data =~ /name=\"sequence\" value=\"([AGCT]*).*name=\"name\" value=\"([^\"])\"/;
print \"$2\\n$1\";