2014-10-30 62 views
-1

我是Perl中的新程序員,我希望在文件中找到模式並將其與行的其餘部分一起刪除。例如,如何使用Perl刪除文件匹配和文件的其餘部分使用Perl

「輸入文件」

>hsa-let-7a-5p MIMAT0000062 Homo sapiens let-7a-5p 
UGAGGUAGUAGGUUGUAUAGUU 
>hsa-let-7a-3p MIMAT0004481 Homo sapiens let-7a-3p 
CUAUACAAUCUACUGUCUUUC 
>hsa-let-7a-2-3p MIMAT0010195 Homo sapiens let-7a-2-3p 
CUGUACAGCCUCCUAGCUUUCC 
>hsa-let-7b-5p MIMAT0000063 Homo sapiens let-7b-5p 
UGAGGUAGUAGGUUGUGUGGUU 

「所需的輸出文件」

>hsa-let-7a-5p MIMAT0000062 
UGAGGUAGUAGGUUGUAUAGUU 
>hsa-let-7a-3p MIMAT0004481 
CUAUACAAUCUACUGUCUUUC 
>hsa-let-7a-2-3p MIMAT0010195 
CUGUACAGCCUCCUAGCUUUCC 
>hsa-let-7b-5p MIMAT0000063 
UGAGGUAGUAGGUUGUGUGGUU 

我想找到字符串「智人」,並刪除它,以及的其餘部分線。

我寫了下面的代碼,但它不是功能

#!/usr/bin/perl 
use strict; 
use warnings; 

my $find = "Homo sapiens"; #string for searching 
open (FILE1, "input.fasta") || die "Cannot open the file!"; #open for reading 
open (FILE2, ">>output.fasta") || die "Cannot open the file!"; #open for writing 

while (my $line = <FILE1>){ 
     if ($line =~ /$find/){ 
       print FILE2 $line; 
       print FILE2 scalar <FILE1>; 
     } 
}     

close(FILE1); 
close(FILE2); 

exit; 

感謝

回答

0

大多數Linux世界中有一個行程序的迷戀,所以這裏是一個在線的解決方案,按照你的要求做

perl -pe's/\s*Homo Sapiens.*//i' input.txt 

它會進行你所描述的變化並將結果發送到STDOUT。

如果你想寫的改變文本到一個新的文件,然後簡單地重定向輸出,具有類似

perl -pe's/\s*Homo Sapiens.*//i' input.txt > fixed.txt 

輸出

>hsa-let-7a-5p MIMAT0000062 
UGAGGUAGUAGGUUGUAUAGUU 
>hsa-let-7a-3p MIMAT0004481 
CUAUACAAUCUACUGUCUUUC 
>hsa-let-7a-2-3p MIMAT0010195 
CUGUACAGCCUCCUAGCUUUCC 
>hsa-let-7b-5p MIMAT0000063 
UGAGGUAGUAGGUUGUGUGGUU 

如果你不是那些人之一你需要幫助來編寫相應的Perl程序,然後請問。


更新

一個等效的程序是這樣的。我叫它sapiens.pl。你會從與輸入文件作爲參數的命令行運行它,如

sapiens.pl input.txt > fixed.txt 

#!/usr/bin/perl 

use strict; 
use warnings; 

my $remove = 'Homo sapiens'; 

while (<>) { 
    s/\s*$remove.*//i; 
    print; 
}     
+0

'\ s *'是否必要? – Floegipoky 2014-10-30 22:25:06

+0

或者'perl -ne'print除非/ Homo Sapiens /' - - 取決於提問者是否想要空白行或刪除行。 – 2014-10-30 22:32:10

+0

@JimDavis:問題說明他們想要的東西 – Borodin 2014-10-31 00:52:47

0

我會取代你的while環路與以下。

while (<FILE1>){ 
    s/$find.*//; 
    print FILE2 $line; 
} 

予加載的線到默認變量通過不特別將其分配給任何其他變量,然後施加的替換操作符到它。我正在用你的變量替換空字符串中的任何字符。我們不需要檢查替代是否有效。如果是這樣,那麼我們刪除了不需要的字符;如果不是,那麼我們希望整條線。