Perl脚本打印出包含关键字及其下方行的所有行

时间:2014-11-24 21:03:05

标签: perl text

我需要编写一个perl脚本来搜索大文件中的关键字,然后将包含关键字的所有行以及每个关键字下面的行打印到新文件中。

在原始文件中,每个含关键字的行下方有多行(确切的数字不同)。我已经有一个脚本,它使可变行数等于1.我需要这个功能保留在脚本中并在其上构建。

我发现我可以使用grep来提取行,但是这需要先运行我已经拥有的脚本然后使用grep命令。我真的需要将这些功能组合成一个。

任何帮助都很有帮助!

这是我到目前为止的脚本:

use strict;
open (FILE, $ARGV[0]) or die ("Cannot open file");
my $name;
my $sequence;
while (my $line = <FILE>) {
    chomp ($line);
    if (substr ($line, 0, 1) eq ">") {
            if ($sequence ne "") {
                    printf if / ("%s\n%s\n", $name, $sequence);
            }
            $name = $line;
            $sequence = "";
    } else {
    $sequence .= $line;
}
}
if ($sequence ne "") {
    printf ("%s\n%s\n", $name, $sequence);
}

原始档案的一个例子:

  

sp | Q6GZX4 | 001R_FRG3G推定的转录因子001R OS =青蛙病毒3(分离的Goorha)GN = FV3-001R PE = 4 SV = 1   MAFSAEDVLKEYDRRRRMEALLLSLYYPNDRKLLDYKEWSPPRVQVECPKAPVEWNNPPSEKGLIVGHFSGIKYKGEKAQASEVDVNKMCCWVSKFKDAMRRYQGIQTCKIPGKVLSDLDAKIKAYNLTVEGVEGFVRYSRVTKQHVAAFLKELRHSKQYENVNLIHYILTDKRVDIQHLEKDLVKDFKALVESAHRMRQGHMINVKYILYQLLKKHGHGPDGPDILTVKTGSKGVLYDDSFRKIYTDLGW

在此示例中,关键字为&#34; FRG3G&#34;。该关键字始终位于同一位置,前面的字符各不相同,但结构相同。

1 个答案:

答案 0 :(得分:0)

如果在关键字行后只打印一行,您可以记住是否找到了关键字,然后打印出如下所示的行:

my $matched = 0;
while (<FILE>) {
    print if ($matched);
    if (m/$keyword/) {
        print;
        matched = 1;
    }
    else {
        matched = 0;
    }
}

如果您能以某种方式检测到要打印的行的结尾,则可以调整上面的代码,而不是仅仅对其进行硬编码以打印1行。

根据需要重定向到新文件。