【问题标题】:How do I extract a line matching a string and the next line?如何提取与字符串匹配的行和下一行?
【发布时间】:2012-08-01 05:53:49
【问题描述】:

我有两个文件,分别是a.txtb.txt。我的任务是在b.txt 中搜索a.txt 的所有字符串。如果我在a.txtb.txt 的字符串之间有任何匹配,那么我想从文件b.txt 中打印与该字符串对应的行及其下一行。

我一直在尝试下面提到的代码,但问题是它没有打印任何东西。能否请您指出问题并提出解决方法?

open fh,  "<", "b.txt" or die $!;
open fh1, "<", "a.txt" or die $!;

my $array1 = < fh>;
my $array2 = < fh1>;

while (my $array1 = < fh>) {
    if ($array1 =~ m/$array2/i) {
        print $array1;
        print scalar < fh>;
    }
}

【问题讨论】:

    标签: string perl text-extraction


    【解决方案1】:

    试试这样的

    open  fh, "<", "b.txt" or die $!;
    open  fh1, "<", "a.txt" or die $!;
    
    while(my $item1 = <fh>)
    {
        while(my $item2 = <fh1>)
        {
            if($item1 =~ m/$item2/i)
            {
                print $item1;
                print <fh>;
            }
        }
    
        seek fh1, 0, 0;
    }
    
    close fh;
    close fh1;
    

    【讨论】:

    • 非常感谢BSen,它可以工作但是一旦搜索了a.txt的第一个元素,我想将匹配的数据打印到另一个文件中。即在 a1.txt 中搜索的第一个元素,在 a2.txt 中搜索的第二个元素,以此类推。目前,在您的帮助下,我可以将所有元素保存在一个文件中。
    • 你能帮我修改你给的代码,完成我上面评论中提到的任务
    • 如果我明白你想要什么,然后在循环外添加一个变量,在每次匹配时递增它并打开新文件的句柄(使用变量来形成名称,例如 a1、a2 ...)然后写入并关闭它
    • 这是我尝试使用您建议的代码的方法。** 打开 fh、") { **while(my $item2 = ) **{ **if($item1 =~ m/$item2/i) **{ **my $我=0; **{ **打印 fh2 $item1; **打开 fh2,“>>”,“c$i.txt”; **我++; **打印 ; **} **} **seek fh1, 0, 0; **} **} **关闭 fh; **关闭fh1; **关闭 fh2;这不起作用..所以你能建议我怎么做吗
    • 不确定要打印到文件的内容,但试试这个pastebin.com/V2bHGJAF
    【解决方案2】:

    这是显而易见的:

    use strict;
    use warnings;
    
    my $line1;
    my $line2;
    my $fh;
    my $fh1;
    my $counter;
    
    open  $fh, "<", "b.txt" or die $!;
    open  $fh1, "<", "a.txt" or die $!;
    
    my @b = <$fh>;
    my @a = <$fh1>;
    
    for (@b)
    {
        $line1 = $_;
        for (@a)
        {
            $line2 = $_;
            if ($line1 =~ /^$line2$/)
            {
                $counter++;
                open $outfile, ">", "a_${counter}.txt";
                print $outfile $line2;
                close $outfile;
            }
        }
    }
    

    我不太明白你想用scalar做什么?

    【讨论】:

    • 非常感谢 Hameed。它可以工作 但是一旦搜索了 a.txt 的第一个元素,我想将匹配的数据打印到另一个文件中。即在 a1.txt 中搜索的第一个元素,在 a2.txt 中搜索的第二个元素,以此类推。目前,在您的帮助下,我可以将所有元素保存在一个文件中
    • 这是否意味着您将拥有与匹配数量一样多的文件?
    • 非常感谢您的快速回复,.....是的,我将拥有与匹配数量一样多的文件。如果我在 a.txt 中有 n 个元素,则将在 b.txt 中搜索这 n 个元素,如果为所有 n 个元素找到匹配项,则它们将是 n 个文件。在我的情况下,数字可能在 7-10 个元素之间变化,因此 7-10 个文件。
    • 启动一个计数器,每次获得匹配项时,递增计数器,使用计数器作为文件名open my $outfile, "&gt;", "a${counter}.txt" 的一部分打开一个文件,然后写入并关闭它。
    • 这是我想做的,但我无法打印任何文件或生成你提到的任何文件。目前我无法找出问题所在,我正在努力工作就可以了。
    【解决方案3】:

    我可以帮助你获得两个元素数组,我不明白你想如何打印匹配的元素和下一个元素,

    use Data::Dumper;
    open(FH,  "<$file") or die "$!";
    open(FH1,  "<$file1") or die "$!";
    my @array1 ;
    my @array2 ;
    
    
    while(<FH>) {
        chomp($_);
        push @array1,$_;
    }
    while(<FH1>) {
        chomp($_);
        push @array2,$_;
    }
    close(FH);
    close(FH1);
    print Dumper(@array1);
    print Dumper(@array2);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 2020-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多