Uma maneira possível de fazer isso seria usar a função descompactar do perl, com um modelo construído a partir de a primeira linha do arquivo.
Depois de remover o espaço em branco, ele usa uma expressão regular com uma referência de repetição repetitiva para localizar as sequências contíguas mais longas de caracteres idênticos que não excedem o dado maxwidth
e armazena suas posições em uma matriz. As larguras de campo são extraídas subtraindo elementos adjacentes da matriz e mapeadas em uma string de modelo adequada da forma A5A5A1A5A3A5A3
para passar para a função unpack
.
#!/usr/bin/perl -l
use strict;
use warnings;
my $filename = shift or die "Usage: $0 FILENAME MAXWIDTH\n";
my $maxwidth = shift or die "Usage: $0 FILENAME MAXWIDTH\n";
open my $infile, $filename or die "Could not open $filename: $!";
my $n = $maxwidth-1;
my $template;
while( my $line = <$infile> ) {
$line =~ s/\s+//g;
if ($. == 1) {
my @ends = (0);
while ($line =~ /(.)\g1{0,$n}/g) {
push(@ends, pos $line);
}
my @fieldwidths = map $ends[$_] - $ends[$_-1], 1 .. $#ends;
# http://stackoverflow.com/a/29821158/4440445
$template = join "", map { 'A' . $_ } @fieldwidths;
# http://stackoverflow.com/a/2725663/4440445
}
my @fields = unpack($template, $line);
print join " ", @fields;
}
close $infile;