数据文件是定长文件,我想逐行读取文件并从当前行取出一个字符串,然后将该字符串附加到后续行并写入另一个文件。
例如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";
}