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

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

Re: [shell-script] Criação de arquivo


From: Julio C. Neves
Subject: Re: [shell-script] Criação de arquivo
Date: Thu, 20 Mar 2014 11:45:21 -0300

Fala Paulo,
a solução que mandei na proposta anterior estava furada, pq não percebi que tinham aspas envolvendo cada campo. Te peço o favor de comparar os tempos do awk e das 3 soluções sed que coloquei abaixo.

1 - Executando somente um cmd sed:
$ sed  -r 's/"[0-9]+";"([0-9]+)";"([0-9]+).*/sinc_t \1 U \2 U/' <<< '"3333222111111111";"20130101";"000000";"REM BASICA";"0.00";"C"'

2 - Executando 3 sed para ER simples:
$ sed  's/"[0-9]*";"/sinc_t /;s/";"/ U /;s/".*/ U/' <<< '"3333222111111111";"20130101";"000000";"REM BASICA";"0.00";"C"'

3 - Executando 3 sed para ERs expandidas:
$ sed  -r 's/"[0-9]+";"/sinc_t /;s/";"/ U /;s/".*/ U/' <<< '"3333222111111111";"20130101";"000000";"REM BASICA";"0.00";"C"'

Abcs,
Julio
@juliobash

Próximos cursos de Shell

Cidade

Local

Período

Rio de Janeiro

EDX

07-11/04

Dou treinamento de shell em qualquer cidade.
Para detalhes, entre em contato por email ou
echo 436233889341364416673541503686485725801923229706P | dc 



Em 19 de março de 2014 17:00, Paulo Bettega <address@hidden> escreveu:
 

Olá Valtoir, o tempo do sed é praticamente o mesmo do awk.

loop com while
real 0m1.940s
user 0m0.624s
sys 0m0.353s

paste
real 0m0.048s
user 0m0.013s
sys 0m0.007s

awk
real 0m0.015s
user 0m0.016s
sys 0m0.004s

time sed 's/^/sinc_t /; s/;/ U /; s/;.*/ U/' 01.txt
real 0m0.014s
user 0m0.008s
sys 0m0.001s

Antes eu cortava os campos 2 e 3, mas agora cortei 1 e 2 porque
tive uma dúvida no sed, talvez seja assunto de um novo tópico :)

Tentei pegar o segundo e terceiro campos com o sed desse jeito mas não consegui
sed 's/.*;/sinc_t /' <<<'"3333222111111111";"20130101";"000000";"REM BASICA";"0.00";"C"'

eu queria o resultado
sinc_t "20130101";"000000";"REM BASICA";"0.00";"C"
mas deu
sinc_t "C"

sei que é por causa do * guloso, mas tentei
sed -r 's/.*?;/sinc_t /'
e deu o mesmo resultado

Como fazer um sed que resulte nisso?
sed -r 'comandos' <<<'"3333222111111111";"20130101";"000000";"REM BASICA";"0.00";"C"'
sinc_t "20130101" U "000000" U

Teria que especificar o tamanho e conteúdo dos campos mesmo? Com o .* não dá certo?

Abraços Paulo Bettega

On 19-03-2014 15:35, Valtoir wrote:
> Por curiosidade, tentaste o mesmo usando sed?
>
> T+
>
> Valtoir
>
>
> Em 19 de março de 2014 14:20, Paulo Bettega <address@hidden
> <mailto:address@hidden>> escreveu:
>
> __
>
> Olá pessoal, como o awk não é meu amigo (ainda), fiz um loop linha por linha com while,
> e fiquei espantado com a diferença de tempo de execução entre o loop com while e o comando do awk.
>
> O arquivo que eu usei tem 65 linhas, tem a linha com os nomes dos campos
> e mais 64 linhas com os valores (é um extrato de poupança).
>
> "Conta";"Data_Mov";"Nr_Doc";"Historico";"Valor";"Deb_Cred"
> "3333222111111111";"20130101";"000000";"REM BASICA";"0.00";"C"
>
> time while read linha; do
> echo "sinc_t $( echo $linha|cut -d\; -f2) U $(echo $linha|cut -d\; -f3) U"
> done <01.txt
>
> real 0m1.954s
> user 0m0.723s
> sys 0m0.260s
>
> awk do Ernander, só mudei o separador
> time awk 'BEGIN {FS=";"}{print "sinc_t "$2" U "$3" U"}' 01.txt
>
> real 0m0.217s
> user 0m0.013s
> sys 0m0.010s
>
> O awk é quase dez vezes mais rápido? É isso mesmo ou eu cometi algum erro?
> Os tempos variam, mas o awk sempre é menos de 0,5s e o while sempre é mais de 1,5s.
> Na grande maioria das vezes a diferença é essa de quase dez vezes a mais.
>
> Vendo que trabalhar com colunas talvez seja melhor do que com linhas, pensei em cortar as
> colunas e imprimir com o paste.
> time paste -d U <(
> while read linha; do
> echo "sinc_t $linha "
> done <<<"$(cut -d\; -f2 <01.txt)"
> ) \
> <(
> while read linha; do
> echo " $linha U"
> done <<<"$(cut -d\; -f3 <01.txt)"
> )
>
> real 0m0.056s
> user 0m0.015s
> sys 0m0.005s
>
> Ficou muito mais próximo do tempo do awk do que do loop linha por linha do while.
>
> Conclusão que eu tirei, linha por linha só se não tiver outro jeito,
> e começar a aprender awk pra valer :)
>
> Abraços Paulo Bettega
>
>
>
> On 17-03-2014 11:33, Ernander (Nander) wrote:
> > Olha como é mais Fácil, viu?
> >
> > com esses dados vc pode fazer::
> >
> > awk '{print "sinc_t "$1" U "$2" U"}' arquivo.txt
> >
> > Teste aí Veja:ernander@TensaZangetsu ~ $ cat arquivo.txt Contratos Telefones TESTE01
> > 3322229999 xxxxxxx xxxxxxxxxx ernander@TensaZangetsu ~ $ awk '{print "sinc_t "$1" U "$2"
> > U"}' arquivo.txt sinc_t Contratos U Telefones U sinc_t TESTE01 U 3322229999 U sinc_t xxxxxxx U
> > xxxxxxxxxx U ernander@TensaZangetsu ~ $
> >



reply via email to

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