perl 脚本捕获我的查找和更正第二行

bybem2ql  于 2023-06-23  发布在  Perl
关注(0)|答案(2)|浏览(138)

我有一个Perl程序,它根据正则表达式匹配捕获输入文件的第一行和第二行。
在我的输入文件中,在我需要的细节中有标题分隔符,它没有捕获我想要的行,所以细节的第二行不在那里。
有没有可能修改我的程序,使其能够根据空格或第二行的位置捕获正确的细节行?
如果发生这种情况,则头分割和第二行始终在整个文件的相同位置。
下面是我目前为止的脚本,但是正如我提到的,当第二行在细节中有一个标题分割时,它不能捕获我想要的第二行。

use strict;

my $find  = '^(J0|JT)';
my $match = 0;

open( NEW,  ">", "output.txt" )   or die "could not open:$!";
open( FILE, "<", "combined.txt" ) or die "could not open:$!";

while (<FILE>) {
    chomp;

    if ($match) {
        $match = 0;
        print NEW "$_\n";
    }

    if (/$find/) {
        $match = 1;
        print NEW "$_";
    }
}
close(FILE);
close(NEW);

combined.txt

---------------------------------------------------------------------------------
JT00000000  DOE, JANE              01/23/16            J00000000    1    01/27/16
              U# NUMBER        UNIT #                                FAIL        
---------------------------------------------------------------------------------
JT00000000  DOE, JOHN              01/24/16            J00000000    1    01/28/16

                             CLAIM DETAIL
                                                                          
PATIENT                           ADM/SER   DIS DATE  UNIT #       NUM  BILL DATE 
              CHECKS           DESCRIPTION                           VALUE (FIRST)
              TOB AFTER        UNIT #                                FAIL         
----------------------------------------------------------------------------------
J000000000  DOE, JOHN              01/25/16  01/31/16  J00000000    1    01/29/16 
              TXN MISS         UNIT #                                FAIL

output.txt(必填)

JT00000000  DOE, JANE              01/23/16            J00000000    1    01/27/16 U# NUMBER  UNIT #   FAIL                                      
JT00000000  DOE, JOHN              01/24/16            J00000000    1    01/28/16 TOB AFTER           FAIL                                      
J000000000  DOE, JOHN              01/25/16  01/31/16  J00000000    1    01/29/16 TXN MISS            FAIL
toiithl6

toiithl61#

这将仅打印标题分隔符之间的第一行和最后一行。它保留所有行的缓冲区,直到下一个中断。请注意,我在结尾添加了一个标题中断。

use warnings;
use strict;

my @lines;
while (<DATA>) {
    chomp;
    if (/^-/) {
        if (@lines) {
            print @lines[0, -1], "\n";
        }
        @lines = ();
    }
    else {
        push @lines, $_;
    }
}

__DATA__
---------------------------------------------------------------------------------
JT00000000  DOE, JANE              01/23/16            J00000000    1    01/27/16
              U# NUMBER        UNIT #                                FAIL        
---------------------------------------------------------------------------------
JT00000000  DOE, JOHN              01/24/16            J00000000    1    01/28/16

                             CLAIM DETAIL

PATIENT                           ADM/SER   DIS DATE  UNIT #       NUM  BILL DATE 
              CHECKS           DESCRIPTION                           VALUE (FIRST)
              TOB AFTER        UNIT #                                FAIL         
----------------------------------------------------------------------------------
J000000000  DOE, JOHN              01/25/16  01/31/16  J00000000    1    01/29/16 
              TXN MISS         UNIT #                                FAIL 
----------------------------------------------------------------------------------
bfnvny8b

bfnvny8b2#

我会写这个。它只是跳过不是以J0JT开头的每一行,否则它将打印当前行并读取和打印下一行
编写一个从STDIN读取并写入STDOUT的程序几乎总是更简单。这样你就可以通过运行

$ perl report.pl combined.txt

将输出打印到您的控制台,或

$ perl report.pl combined.txt > output.txt

如果你想把结果写入output.txt就像你原来的程序一样

use strict;
use warnings 'all';

while ( <> ) {

    next unless /^J[0T]/;

    print;
    print scalar <>;
    print "\n";
}

输出

JT00000000  DOE, JANE              01/23/16            J00000000    1    01/27/16
              U# NUMBER        UNIT #                                FAIL        

JT00000000  DOE, JOHN              01/24/16            J00000000    1    01/28/16

J000000000  DOE, JOHN              01/25/16  01/31/16  J00000000    1    01/29/16 
              TXN MISS         UNIT #                                FAIL

相关问题