Perl:
perl -ne '
BEGIN {$width = 10}
while (length) {
($word = substr($_,0,$width)) =~ s/^\s+|\s+$//g; # trim whitespace
$word ||= "-";
print $word, " ";
substr($_,0,$width) = "";
}
print "\n";
' file
Eu tenho um arquivo de tipo de matriz de tamanho fixo, onde cada campo tem 20 caracteres.
Além disso, há alguns valores ausentes, que eu gostaria de substituir por um hífen ( - ).
Eu usarei a saída para as operações awk .
Exemplo de entrada com arquivo de comprimento de campo de 10 caracteres.
head1 head2 head3
a b c
c
c a
Exemplo de saída
head1 head2 head3
a b c
- c -
c - c
Isso funcionou para mim:
sed 's/^ //g' input | tr -s "[:blank:]" "," | \
awk -F, '!$1{printf "- "} $1{printf "%s ", $1} \
!$2{printf "- "} $2{printf "%s ", $2} \
!$3{print "-"} $3{print $3}'
Explicação:
sed 's/^ //g' input remove um espaço inicial se presente tr -s "[:blank:]" "," : substitui todos os espaços por vírgula awk ... : usa o delimitador , e imprime os valores ou - se o valor estiver vazio. Awk way
awk '{for(x=0;x<length($0);x+=10)y=y" "((z=substr($0,x,10))~/[[:graph:]]/?z:"-")
gsub(/ +/," ",y);print y;y=""}' file
Se eles podem ter espaços nos campos
awk '{for(x=0;x<length($0);x+=10){z=gensub(/(^ +| +$)/,"", "g",substr($0,x,10))
y=y" "(z?z:"-")}print y;y=""}' file
Se você tiver gawk , poderá usar a variável FIELDWIDTHS , que informa ao gawk como dividir a entrada com limites colunares fixos. É uma característica experimental. Atribuir a FIELDWIDTHS substitui o uso de FS para divisão de campo.
Aqui está um exemplo de uso,
gawk 'BEGIN{
FIELDWIDTHS = "10 10 10"
}
{
s = q = ""
for(i=1;i<=NF;i++)
{
s = $i
gsub(/ +/,"",s)
s = (length(s) )? s : "-"
q = sprintf("%s%s%s",q,(length(q)?OFS:""),s)
}
print q
}
' file