For não lê o ultimo número [RESOLVIDO]

1. For não lê o ultimo número [RESOLVIDO]

Samuel Bertolini da Silva Oliveira
Samuel Bertolini

(usa Fedora)

Enviado em 27/06/2015 - 18:38h

Olá,
Eu tenho um arquivo chamado LINHAS que tem somente seguinte linha abaixo:

326 52 38 2 34 12 40

Quando faz comando em um script Bash:
total=0
for i in `cat LINHAS`; do
total=$(($total + $i ))
done

O resultado abaixo retorna total igual à 464, ao invés invés de 504, ou seja, não soma o valor 40.
Tentei como solução acionar um texto ( 0) através do sed, mas não funciona. O espaço é adicionado em uma nova linha ao invés da ultima linha
sed "1 s/ 0/g" LINHAS > lista
mv lista LINHAS # LINHAS > LINHAS retorna o arquivo em branco

Alguém poderia me ajudar a solucionar este problema?



  


2. Re: For não lê o ultimo número

Perfil removido
removido

(usa Nenhuma)

Enviado em 27/06/2015 - 20:56h

Aqui eu usei o seguinte arquivo sem linhas em branco:

326 52 38 2 34 12 40 


e com o seguinte código:

#!/bin/bash

total=0

for i in `cat LINHAS`;
do
total=$(($total + $i ))
echo $total
done


a saída foi

326
378
416
418
452
464
504


Tem alguma diferença do que você fez?

--
http://s.glbimg.com/po/tt/f/original/2011/10/20/a97264_w8.jpg

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden


3. Re: For não lê o ultimo número

Wellingthon Dias Queiroz - @tonyhts
tonyhts

(usa Arch Linux)

Enviado em 27/06/2015 - 23:19h

Olá,

Aqui deu o mesmo resultado do brother @Listeiro:

    
326
378
416
418
452
464
504


sobre o que postou do sed:

sed "1 s/ 0/g" LINHAS > lista
mv lista LINHAS # LINHAS > LINHAS retorna o arquivo em branco


O resultado do sed é vazio. Logo, o aquivo lista tbm.

para adicionar "espaço 0" ao fim da linha, faz assim:

sed -i 's/$/ 0/g' LINHAS 

(no code acima o sed vai alterar o arquivo original ( -i) , sem precisar jogar pra outro depois renomear e vai adicionar ao final de todas as linhas o "espaço 0" (g - geral))

e se caso seu arquivo tiver mais do que 1 linha (mesmo que em branco), faz assim:

 sed -i 's/$/ 0/1'  LINHAS  


(no code acima o sed vai alterar o arquivo original e vai adicionar o "espaço 0" apenas no final da primeira linha (1 - primeira ocorrencia))


Verifique se seu arquivo LINHAS nao está poluido co caracteres ocultos. Se tiver algum apos após o 40, será tratado como string/texto e a expressão nao funciona com ele. Nem mesmo os comandos que indiquei acima vaão resolver. Então, para este caso em específico, sugiro fazer assim:

 sed -i 's/40/40 /1'  LINHAS  


no code acima o sed vai alterar o arquivo original, trocar o 40 por 40 + espaço apenas na primeira ocorrência

Abs!


4. Re: For não lê o ultimo número [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 28/06/2015 - 00:37h

Sobre as linhas

sed "1 s/ 0/g" LINHAS > lista
mv lista LINHAS # LINHAS > LINHAS


Você pode fazer o sed operar sobre o próprio arquivo com

sed "1 s/ 0/g" -i LINHAS 


É só usar a opção -i, veja que não comentei sobre sua regex.

--
http://s.glbimg.com/po/tt/f/original/2011/10/20/a97264_w8.jpg

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden


5. Re: For não lê o ultimo número [RESOLVIDO]

Wagner Souza
wagnerfs

(usa Fedora)

Enviado em 28/06/2015 - 10:09h

Bom dia.

Tem a forma abaixo sem usar o for. Não sei a solução seria só com o for ou de outra forma, sendo assim, segue abaixo o comando:

$ cat linhas | tr ' ' + | bc 


Com o comando for o resultado sai como esperado:

#!/bin/bash

total=0

for i in `cat linhas`;
do
total=$(($total+$i))
done

echo "$total"


Veja se o arquivo que estão os números tem apenas um espaço ente estes.
_________________________
Wagner F. de Souza
Técnico/Instrutor de Informática
"GNU/Linux for human beings."
LPI ID: LPI000297782


6. Obrigado!

Samuel Bertolini da Silva Oliveira
Samuel Bertolini

(usa Fedora)

Enviado em 30/06/2015 - 16:19h

Possivelmente é algum carácter oculto, devido a transformação windows para linux. Muito obrigado pela ajuda, também no sed -i. Muito boa a cooperação de todos.

Alguém sabe como limpar caracteres ocultos por linha de comando?

Obrigado!
Samuel Bertolini



7. Continua dando erro

Samuel Bertolini da Silva Oliveira
Samuel Bertolini

(usa Fedora)

Enviado em 30/06/2015 - 16:39h


Mesmo adicionando o 0, ou escrevendo a linha manualmente, continua não processando corretamente. O erro está abaixo. Mas se eu faço manualmente copiar todo o conteúdo do texto e colar em um novo arquivo em branco, funciona normalmente. Ou seja, o problema está em como o bash manipula o arquivo. Não sei como resolver isso e nem qual propriedade do arquivo alterar.
syntax error: invalid arithmetic operator (error token is "")


8. Re: For não lê o ultimo número

Wellingthon Dias Queiroz - @tonyhts
tonyhts

(usa Arch Linux)

Enviado em 30/06/2015 - 19:19h

Opa..

Simples:

sed -i 's/[^0-9]/ /g ; s/\ \+/ /g' LINHAS  

No code acima ele vai substituir tudo que NÃO for número por espaço, depois substitui todos os espaços repetitivos por um só.

dai seu codigo pode ser assim,:


#!/bin/bash

arquivo=LINHAS
# tratando o arquivo
sed -i 's/[^0-9]/ /g ; s/\ \+/ /g' $arquivo

#início do Loop

total=0
for i in `cat $arquivo`
do
total=$(($total + $i ))
echo $total
done


Ou

Se quiser usar um arquivo como parametro do seu script (por exemplo: ./script.sh arquivo.txt)) FAz assim:


#!/bin/bash
# Script que trata os arquivos retirando caracteres ocultos, letras e soma os números nele contidos.
#
# Utilização::
# ./script.sh nome_do_arquivo
#
#Exemplo: ./script.sh dados.txt
#
#

# tratando o arquivo
sed -i 's/[^0-9]/ /g ; s/\ \+/ /g' $1

#início do Loop

total=0
for i in `cat $1`
do
total=$(($total + $i ))
echo $total
done

Acho que resolve seu problema ;)


9. Genial

Samuel Bertolini da Silva Oliveira
Samuel Bertolini

(usa Fedora)

Enviado em 01/07/2015 - 11:45h

tonyhts, você foi genial!
sed -i 's/[^0-9]/ /g ; s/\ \+/ /g'  $1 # simplismente resolveu tudo 


Obrigado a todos!


10. Manter o ponto

Samuel Bertolini da Silva Oliveira
Samuel Bertolini

(usa Fedora)

Enviado em 01/07/2015 - 11:59h

Faltar somente ajustar o sed para manter os pontos no arquivo completo.
por exemplo a linha
13.7533998489 0.0000000000 0.0000000000^M
deverá ser
13.7533998489 0.0000000000 0.0000000000

mas agora está mais fácil! Valeu!





11. Re: For não lê o ultimo número

Wellingthon Dias Queiroz - @tonyhts
tonyhts

(usa Arch Linux)

Enviado em 01/07/2015 - 12:27h

Samuel Bertolini escreveu:

Faltar somente ajustar o sed para manter os pontos no arquivo completo.
por exemplo a linha
13.7533998489 0.0000000000 0.0000000000^M
deverá ser
13.7533998489 0.0000000000 0.0000000000

mas agora está mais fácil! Valeu!





opa!

vamos ajudar nessa tbm..

So que nao entendi o que precisa. rsrs


EDIT:::

Sou meio lento mesmo.... rs

EDIT2::::

para manter os pontos faz assim:


sed -i 's/[^0-9.]/ /g ; s/\ \+/ /g' $1


:))



12. RESOLVIDO

Samuel Bertolini da Silva Oliveira
Samuel Bertolini

(usa Fedora)

Enviado em 01/07/2015 - 12:55h


RESOLVIDO!
sed -i 's/[^0-9,.,a-z,A-Z]/ /g ; s/\ \+/ /g'  $1 




01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts