awk ou comando sed para iniciar cada coluna de arquivo dos locais desejados ou Byte Position

3

Eu tenho um formato de arquivo de origem, como abaixo, contendo 15 colunas e muitas linhas:

23.5 31.5 5.00 255   0 255 2 1 sal unknown sa time sps meter ms
25.5 32.5 6.00   0 255   0 2 2 sal unknown sa time sps meter ms

Eu o converto no formato desejado usando o seguinte comando awk:

awk '{printf " %-12s %-13s %-8s%3s %3s %3s %2s %-2s %-47s %-20s %-5s %-11s %-39s %-19s %-6s \n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15 }' source.fault_data > target_fmt.dat

Existe algum comando curto para convertê-lo ou preenchimento entre 15 colunas?

Formato desejado:

Col. No.   Col. should be between these positions 
1                   1   12
2                   13  24
3                   25  36
4                   37  39
5                   41  43
6                   45  47
7                   49  50
8                   51  52
9                   53  102
10                  103 122
11                  123 127
12                  128 139
13                  140 179
14                  180 199
15                  200 205
    
por Salman 06.06.2016 / 11:07

1 resposta

3

Ok, eu acredito que você quer:

  • para ter 1 arquivo com 3 linhas, descrevendo cada coluna: number, start-pos, end-pos
  • e, em seguida, usar essa formatação para exibir o conteúdo de outro arquivo

Aqui está uma primeira tentativa. Note que eu assumo as coisas:

  • o formattingfile é bem definido como você mostrou, ou seja:
    • o número de cols aumenta,
    • col. Não são descritos em ordem sem falta
    • e há uma primeira linha de "título")
  • e o filetodisplay NÃO tem linha de título.

Aqui está um programa awk para tentar fazer isso:

 awk ' BEGIN {lastendcol=0;}
      ( NR == FNR) && ( FNR == 1 )  { next ;}
      ( NR == FNR)  { formatstring=formatstring "%-"($3-lastendcol)"s" ;
                      lastendcol=$3;
                      next ;}

          { printf formatstring"\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15 ;}
    '  formattingfile  filetodisplay

A primeira passagem (NR == FNR) lerá "formattingfile", ignorando a primeira linha (título), para criar a variável de formatação "formatstring".

O segundo passe (NR > FNR) exibirá cada linha de 'filetodisplay' usando "formatstring \ n".

claro, aqui, os 2 arquivos são:

arquivo "filetodisplay":

23.5 31.5 5.00 255   0 255 2 1 sal unknown sa time sps meter ms
25.5 32.5 6.00   0 255   0 2 2 sal unknown sa time sps meter ms
etc ....

arquivo "formattingfile":

Col. No.   Col. should be between these positions 
1                   1   12
2                   13  24
3                   25  36
4                   37  39
5                   41  43
6                   45  47
7                   49  50
8                   51  52
9                   53  102
10                  103 122
11                  123 127
12                  128 139
13                  140 179
14                  180 199
15                  200 205
    
por 06.06.2016 / 15:49