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: Paulo Bettega
Subject: Re: [shell-script] Criação de arquivo
Date: Wed, 19 Mar 2014 17:00:26 -0300
User-agent: Mozilla/5.0 (X11; Linux i686; rv:24.0) Gecko/20100101 Thunderbird/24.3.0

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]