如何使用perl获取每个数据记录的第一行?

时间:2013-05-17 14:28:57

标签: perl

数据记录如下所示:

  1aaaaaaaaaaaaaaa
  aaaaaaaaaaaaaaaa
  aaaaaaaaaaaaaaaa
  __Data__
  1bbbbbbbbbbbbbbb
  bbbbbbbbbbbbbbbb
  bbbbbbbbbbbbbbbb
  __Data__
  1ccccccccccccccc
  cccccccccccccccc
  cccccccccccccccc

Perl代码:

 $/="__Data__";

 open READFILE,"<","a_test.txt" or die "Unable to open file $file";
 while(<READFILE>)
 {      
    if(/^([^\n]*)\n([^\n]*)\n/sm)
    {       
        print "$1\n";
    }
}
close(READFILE);

此代码仅输出1aaaaaaaaaaaa而不输出其他记录的第一行。我确定还有其他方法可以做到这一点,但使用这种代码格式,我怎样才能让其他记录只显示他们的第一行。理想的结果将是:

 1aaaaaaaaaaaaaa
 1bbbbbbbbbbbbbb
 1cccccccccccccc

5 个答案:

答案 0 :(得分:2)

您可以更改正则表达式以输出所需内容,

if (/ (.+) /x) { print "$1\n"; }

在每条记录中,这将与您在上面描述的第一行匹配。

答案 1 :(得分:2)

尽管逐段处理文件很有吸引力,但在这种情况下,逐行扫描似乎更为明确 - 因为所需的输出是面向行的。这样就无需解析各个部分。

my $marker = "__Data__\n";
my $flag   = 1;

while (my $line = <>){
    print $line if $flag;
    $flag = $line eq $marker;
}

答案 2 :(得分:2)

在一行中:

$ perl -nle 'print; $_=<> until /^__Data__/ or eof' input.txt

答案 3 :(得分:0)

一种解决方案是删除前导空间,拆分换行符并打印第一个元素,如:

while(<READFILE>)
{           
    s/\A\s*//;
    printf qq|%s\n|, (split /\n/)[0];
}

答案 4 :(得分:0)

我将重复一个我在这里多次说过的想法:一行只是记录概念的一个实现。它是默认实现,但它不是唯一的实现。

  • 记录分隔符设置为"\n__Data__\n"
  • 只需打印从正则表达式中提取的所有非换行符:

    use English qw<$RS>;
    local $RS = "\n__Data__\n";
    
    while ( <> ) { # A generic read
        print /(.*)/, "\n";
    }
    

因此,您将数据按记录分开,由__Data__分隔,并仅拉出第一行。