Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl脚本打印出包含关键字及其下一行的所有行_Perl_Text - Fatal编程技术网

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

Perl脚本打印出包含关键字及其下一行的所有行,perl,text,Perl,Text,我需要编写一个perl脚本来搜索一个大文件中的关键字,然后将包含该关键字的所有行加上每个关键字下面的行打印到一个新文件中 在原始文件中,每个包含关键字的行下面都有多行(具体数字各不相同)。我已经有了一个脚本,使可变行数等于1。我需要将此功能保留在脚本中并在此基础上构建 我发现我可以使用grep来提取行,但这需要先运行我已有的脚本,然后使用grep命令。我真的需要将这些函数组合成一个函数 任何帮助都是非常感激的 以下是我到目前为止的脚本: use strict; open (FILE, $ARGV

我需要编写一个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);
}
使用严格;
打开(文件$ARGV[0])或死亡(“无法打开文件”);
我的$name;
我的$sequence;
while(我的$line=){
chomp($line);
if(substr($line,0,1)eq“>”){
如果($ne“”){
printf if/(%s\n%s\n“,$name,$sequence);
}
$name=$line;
$sequence=“”;
}否则{
$sequence.=$line;
}
}
如果($ne“”){
printf(“%s\n%s\n”,$name,$sequence);
}
以及原始文件的示例:

sp | Q6GZX4 | 001R | FRG3G假定转录因子001R OS=青蛙病毒3(古尔哈分离物)GN=FV3-001R PE=4 SV=1 MafsaedVLKEYDRRRRMALLYPndrklyNewsPpprVqVecKvGhfsfsgyKvKgKvKvKdKvKdKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKvKv


在本例中,关键字为“FRG3G”。关键字始终位于同一位置,前面的字符不同,但结构相同。

如果在关键字行之后只有一行要打印,您只需记住是否找到了关键字,然后按如下方式打印该行:

my $matched = 0;
while (<FILE>) {
    print if ($matched);
    if (m/$keyword/) {
        print;
        matched = 1;
    }
    else {
        matched = 0;
    }
}
my$matched=0;
而(){
如果匹配,则打印($matched);
if(m/$keyword/){
印刷品;
匹配=1;
}
否则{
匹配=0;
}
}
如果您能以某种方式检测到要打印的行的末尾,您可以调整上面的代码,而不是将其硬编码为打印一行


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

通过“关键字始终位于同一位置”,您的意思是它总是从第16个字符开始吗?或者,您的意思是它总是在第一个下划线之后的第三个管道分隔字段中?还是别的什么?谢谢你的快速回复!您提到的两个条件在这种情况下都适用(关键字总是从第16个字符开始,并且总是在第3个管道分隔字段中,在第一个下划线之后)。很抱歉我的歧义。嗯,但是当关键字下面的行数不同时,我不能使用grep提取包含行+下面行的关键字。例如,在原始文件中,当关键字为“human”时,每个“human”下面的行数可能为1-5。很抱歉,我不知道如何将其添加到现有代码中,以便它可以工作。