1行ずつ読み、行の文字列を取得し、perl [duplicate]を使用してその文字列を後続の行に割り当てます。

1行ずつ読み、行の文字列を取得し、perl [duplicate]を使用してその文字列を後続の行に割り当てます。

データファイルは固定長ファイルであり、ファイルを1行ずつ読み込み、現在の行から文字列を取得し、その文字列を次の行に追加して別のファイルに書きたいと思います。

例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

上記の例2を実装するにはPerlを使用する必要がありますか?

答え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";
}

関連情報