2011-05-27 65 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";