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