lê linha por linha e pega uma string na linha e atribui essa string à linha subsequente usando perl [duplicate]

0

O arquivo de dados é um arquivo de tamanho fixo, e eu quero ler o arquivo linha por linha e pegar uma string da linha atual, e depois anexar essa string à linha subseqüente e escrever em outro arquivo.

Por exemplo1, dado o arquivo:

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

A saída deve ser:

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

Você pode me ajudar a implementar isso com o Perl?

Por exemplo2, dado o arquivo:

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

A saída deve ser:

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

Você pode me ajudar a implementar o exemplo acima 2 com Perl?

    
por user36697 08.04.2013 / 14:07

1 resposta

1

Lembre-se apenas da parte "interessante" da linha anterior e adicione-a quando a linha começar com "AA", "BB" ou "MTD" (no último caso, apenas a parte curta da string é substituída):

#!/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]) /) {
        substr $line, 11, 0, $repeat[0] . $repeat[1];
    }
    print "$line\n";
}
    
por 08.04.2013 / 14:30