逐行读取并获取行中的字符串并使用 perl 将该字符串分配给后续行

逐行读取并获取行中的字符串并使用 perl 将该字符串分配给后续行

数据文件是定长文件,我想逐行读取文件并从当前行取出一个字符串,然后将该字符串附加到后续行并写入另一个文件。

例如1,给定文件:

AAABBBB11115678xxxx
BBBCCCC22221234YYYY
MTD0001abcdARN12345 abcdedfg
AA 0002bcde
BB 0003defg
CCCDDDD33331234zzzz
MTD0003qwerTRN56789 defghigk
AA 9876bvcn
BB 8765zxcv
XXXBBBB11115678aaaa
YYYCCCC22221234bbbb

输出应该是:

AAABBBB11115678xxxx
BBBCCCC22221234YYYY
MTD0001abcdARN12345 abcdedfg
AA 0002bcdeARN12345
BB 0003defgARN12345
CCCDDDD33331234zzzz
MTD0003qwerARN56789 defghigk
AA 9876bvcnARN56789
BB 8765zxcvARN56789
XXXBBBB11115678aaaa
YYYCCCC22221234bbbb

例如2,给定文件:

AAABBBB11115678xxxxbedfgd
BBBCCCC22221234YYYYabcd
MTD0001abcdARN12345 abcdedfg 12345abcd
AA 0002bcde
BB 0003defg
CCCDDDD33331234zzzzqwerty
MTD0003qwerTRN56789 defghigk 45677defg
AA 9876bvcn
BB 8765zxcv
XXXBBBB11115678aaaazeftfy
YYYCCCC22221234bbbbefgydy

输出应该是:

AAABBBB11115678xxxxbedfgd
BBBCCCC22221234YYYYabcd
MTD0001abcdARN12345 abcdedfg 12345abcd
AA 0002bcdeARN12345
BB 0003defgARN12345
CCCDDDD33331234zzzzqwerty
MTD0003qwerARN56789 defghigk 45677defg
AA 9876bvcnARN56789
BB 8765zxcvARN56789
XXXBBBB11115678aaaazeftfy
YYYCCCC22221234bbbbefgydy

我需要用 Perl 来实现上面的例子 2 吗?

答案1

只需记住上一行的“有趣”部分,并在该行以“AA”、“BB”或“MTD”开头时添加它(在最后一种情况下,仅替换字符串的短部分):

#!/usr/bin/perl
use warnings;
use strict;

my @repeat;
while (my $line = <>) {
    chomp $line;
    if (my ($first, $second) = $line =~ /^MTD.{8}(...)(.*?) /) {
        $repeat[0] //= $first;
        $repeat[1] = $second;
        substr $line, 11, 3, $repeat[0];
    }
    if ($line =~ /^([AB])\1 /) {
        substr $line, 11, 0, $repeat[0] . $repeat[1];
    }
    print "$line\n";
}

相关内容