format String usando sed

0

Como formatar as seguintes strings de entrada para as strings de saída usando sed?

A string central deve começar no 20º caractere e a string final deve começar no 40º caractere.

entrada:

begining center end     
beg12  cen12  end12
beg13 cen  end

saída:

begining     center      end     
beg12        cen12       end12
beg13        cen         end
    
por spiderman 17.05.2017 / 08:48

6 respostas

2

awk pode ser usado para formatar esses dados com sua função printf() .

$ awk '{ printf("%-20s%-20s%s\n", $1, $2, $3) }' data.in
begining            center              end
beg12               cen12               end12
beg13               cen                 end

Isso pressupõe que os dados no arquivo são separados por espaço em branco.

Para dar a largura da coluna como um parâmetro:

$ cols=40
$ awk -v c="$cols" 'BEGIN { fmt=sprintf("%%-%ds%%-%ds%%s\n", c, c) } { printf(fmt, $1, $2, $3) }' data.in
begining                                center                                  end
beg12                                   cen12                                   end12
beg13                                   cen                                     end
    
por 17.05.2017 / 09:28
1

Esta é uma daquelas ocasiões em que eu não usaria sed , usaria printf , particularmente o formato %-Ns que preenche a string com espaços em branco até que o "campo" ocupe um mínimo de N caracteres

#!/usr/bin/env bash

while read first second third
do
    printf "%-20s%-20s%s\n" "$first" "$second" "$third"
done <<- 'EOF' 
    begining center end     
    beg12  cen12  end12
    beg13 cen  end
EOF
    
por 17.05.2017 / 09:20
1

awk abordagem:

awk '{printf("%-20s%-20s%-20s\n",$1,$2,$3)}' file

A saída:

begining            center              end                 
beg12               cen12               end12               
beg13               cen                 end 
    
por 17.05.2017 / 09:25
1

Você já recebeu respostas com outras ferramentas, column é a mais óbvia. Eu concordo que sed não é a ferramenta de escolha para isso, mas se você já usa sed para obter a tabela, é desagradável canalizar essa saída para outra ferramenta apenas para formatação. Nesse caso, use algo assim no final do seu script:

sed 's/  */    /g;s/ /     /g;s/\(.\{20\}\) *//g'

Isso substitui todos os grupos de espaços por quatro espaços e, em seguida, cada espaço por cinco espaços, por isso, preenchemos 20 espaços. O terceiro comando s mantém os primeiros 20 caracteres de cada coluna e remove os espaços restantes.

    
por 17.05.2017 / 09:41
1
< yourfile tr -s '\t ' '\t\t' | expand -t 19,39

Resultados

         1         2         3         4         5
12345678901234567890123456789012345678901234567890
begining           center              end
beg12              cen12               end12
beg13              cen                 end

Trabalhando

  • Primeiro, esprememos todos os espaços residuais e / ou TABs apenas para TABs.
  • Em seguida, aplicamos o comando expand no resultante usando a opção -t e listando as posições das guias.
por 17.05.2017 / 11:47
0
sed 's/  */    /g;s/ /     /g;s/\(.\{20\}\) *//g' 

- > Isso dá espaço em cada palavra.

início e fim tem apenas uma palavra. centro tem várias palavras.

beginning          center cntr cnt center              end
beg12              cen12  cnt cntr                     end12
beg13              cen center                          end
    
por 17.05.2017 / 23:52