Como converter campos de tamanho fixo em um arquivo para delimitado por espaço

1

Eu tenho um arquivo de tipo de matriz de tamanho fixo, onde cada campo tem 20 caracteres.

  1. Como posso converter isso em um arquivo delimitado por espaço?

Além disso, há alguns valores ausentes, que eu gostaria de substituir por um hífen ( - ).

  1. Como eu poderia conseguir isso?

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
    
por Hia Sen 22.10.2014 / 22:26

4 respostas

4

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
    
por 22.10.2014 / 23:23
2

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.
por 22.10.2014 / 23:56
1

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
    
por 23.10.2014 / 10:47
0

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
    
por 23.10.2014 / 13:26

Tags