shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Bulk] Re: [shell-script] Preenchimento com espaços a esquerda


From: Sidney Souza
Subject: Re: [Bulk] Re: [shell-script] Preenchimento com espaços a esquerda
Date: Mon, 10 Aug 2015 18:12:14 -0300

Aproveitando a dica do Itamar então.. que tal fazer assim?

awk -F" {2,}" '{printf("%10s%20s%15s\n", $3, $4, $2)}' origin.txt > destination.txt

origin.txt content
       123            cachorro          teste
       123            lobo cac          teste
       123            cachorro          teste
       123            cachorro          teste
       123            cachorro          teste

destination.txt content
  cachorro               teste            123
  lobo cac               teste            123
  cachorro               teste            123
  cachorro               teste            123
  cachorro               teste            123


------------------------------------------------------
http://www.politicos.org.br

2015-08-10 17:47 GMT-03:00 Sidney Souza <address@hidden>:
Tah ai mais uma coisa que aprendo. 

Nunca imaginei que o awk aceitava expressões para definir o limitador de campos.

Obrigado Itamar por mais essa!!

------------------------------------------------------
http://www.politicos.org.br

2015-08-10 15:12 GMT-03:00 address@hidden [shell-script] <address@hidden>:
 

Leandro


Deixe me explicar o porque levando em consideração experiências anteriores que tive.

O Sidney deu uma resposta que a priori parece ser a mais lógica se nos prendermos exclusivamente ao exemplo que forneceu.

Todavia imagine que no lugar de cachorro fosse "lobo guará", teríamos esses problemas:

1. O espaço no nome daria uma contagem errada dos campos a ser usado pelo awk, por isso fiz a opção de colocar como caractere separador o pipe(|), que não limita o texto que pode ter espaço.
2. Caracteres multibytes, dependendo da versão do awk dão uma contagem errada dos caracteres, e por isso não usei a função built-in do awk "substr()", e nisso o sed contorna muito bem, sendo usado para a colocação do caractere separador antes de enviar ao awk.
3. Mas o awk usa como separador de campo uma expressão regular " -F '[|][ ]*' ", que no final quer dizer um pipe seguido de espaços opcionalmente. Para não ter 2 regras, o sed que antecedeu colocou o separador a frente do primeiro campo, o que o transforma no segundo campo. Poderia ter feito " -F '(^ *)|([|][ ]*)' ", mas acho que poderia ser mais confuso.
Com isso, automaticamente faz-se um ltrim de cada campo, eliminando os espaços excedente à esquerda, e possibilitando formatar corretamente no awk.

Como não sei qual o tipo de informação que pode aparecer, e nem a codificação de caracteres do arquivo de entrada, fui numa solução mais portável possível, sem depender muito do shell que usa, e usando recursos mais simples do sed e awk.

Essa solução funciona se não houver nenhum caractere pipe(|) no texto. Se houver troque por um caractere que não faz parte do texto.

A explicação foi suficiente?
[]'s
Itamar
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]