如何使用Perl删除模式匹配和文件的其余部分

时间:2014-10-30 21:13:43

标签: 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

我想找到字符串" Homo sapiens"并删除它以及该行的其余部分。

我编写以下代码,但它不起作用

#!/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;

由于

2 个答案:

答案 0 :(得分: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;
}                

答案 1 :(得分:0)

我会用以下内容替换你的while循环。

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

我将该行加载到默认变量中,并没有专门将其分配给任何其他变量,然后将替换运算符应用于该变量。我替换你的变量在空字符串的行中找到它后面的任何字符。我们不需要检查替换是否有效。如果确实如此,那么我们删除了不需要的字符;如果没有,那么我们想要整条线。