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 17:47:17 -0300

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]