Somando valores com introdução de linhas

1. Somando valores com introdução de linhas

camilo lima
camilolima

(usa Ubuntu)

Enviado em 19/08/2013 - 12:35h

Olá a todos!

Preciso editar um arquivo realizando a soma dos valores e que o resultado fosse dado na linha seguinte com uma legenda. O problema é que as linhas que serão somadas começam como uma legenda parecido com o exemplo abaixo:

Co-SR:N_D;-32,3234
LJ-SR:N_D;-32,6946
LJ-LR:N_D;-0,463281
Co-SR:r_13;0
LJ-SR:r_13;0
LJ-LR:r_13;-0,01999
Co-SR:r_14;-0,000863515
LJ-SR:r_14;-0,00429348
LJ-LR:r_14;-0,0669857
Co-SR:r_15;0
LJ-SR:r_15;0
LJ-LR:r_15;-0,0252353

Além disso, as linhas a serem somadas começam com LJ e na nova linha teria que ter uma nova legenda do tipo LJ:nome e depois o resultado da soma.
Até consigo introduzir as linhas em branco com o comando sed '/LJ-LR:/G', mas não tenho idéia de como introduzir a nova legenda mantendo o nome anterior e realizar a soma =/

Alguém pode dar uma ajuda?

Obrigado pela atenção!


  


2. Re: Somando valores com introdução de linhas

Luís Fernando C. Cavalheiro
lcavalheiro

(usa Slackware)

Enviado em 19/08/2013 - 12:59h

camilolima escreveu:

Olá a todos!

Preciso editar um arquivo realizando a soma dos valores e que o resultado fosse dado na linha seguinte com uma legenda. O problema é que as linhas que serão somadas começam como uma legenda parecido com o exemplo abaixo:

Co-SR:N_D;-32,3234
LJ-SR:N_D;-32,6946
LJ-LR:N_D;-0,463281
Co-SR:r_13;0
LJ-SR:r_13;0
LJ-LR:r_13;-0,01999
Co-SR:r_14;-0,000863515
LJ-SR:r_14;-0,00429348
LJ-LR:r_14;-0,0669857
Co-SR:r_15;0
LJ-SR:r_15;0
LJ-LR:r_15;-0,0252353

Além disso, as linhas a serem somadas começam com LJ e na nova linha teria que ter uma nova legenda do tipo LJ:nome e depois o resultado da soma.
Até consigo introduzir as linhas em branco com o comando sed '/LJ-LR:/G', mas não tenho idéia de como introduzir a nova legenda mantendo o nome anterior e realizar a soma =/

Alguém pode dar uma ajuda?

Obrigado pela atenção!


Esse padrão das linhas se mantém? Digo, um código de quatro letras, um dois-pontos, um outro código, um ponto-e-vírgula, e então os dois números separados por vírgula? Se assim for, use uma boa combinação de cat, cut e o diabo linha a linha.

--
Cordialmente,
lcavalheiro - http://my.opera.com/lcavalheiro/blog/
93 93/93


3. Re: Somando valores com introdução de linhas

camilo lima
camilolima

(usa Ubuntu)

Enviado em 19/08/2013 - 13:24h

sim, esse seria o padrão.
A utilização do cut me retornaria um arquivo sem as linhas em questão, correto?
Além disso, eu precisaria obter no final o resultado logo abaixo das linhas que seriam somadas.
O que seria o "diabo linha a linha"?


4. Re: Somando valores com introdução de linhas

Luís Fernando C. Cavalheiro
lcavalheiro

(usa Slackware)

Enviado em 19/08/2013 - 13:26h

camilolima escreveu:

sim, esse seria o padrão.
A utilização do cut me retornaria um arquivo sem as linhas em questão, correto?
Além disso, eu precisaria obter no final o resultado logo abaixo das linhas que seriam somadas.
O que seria o "diabo linha a linha"?


Você vai ter que fazer um script que processe esse seu arquivo linha a linha, e em cada linha empregar o cut para separar os números, usando o ponto-e-vírgula e a vírgula após este como delimitador.

--
Cordialmente,
lcavalheiro - http://my.opera.com/lcavalheiro/blog/
93 93/93


5. Re: Somando valores com introdução de linhas

Fernando
phoemur

(usa Debian)

Enviado em 19/08/2013 - 18:12h

Somando todas as linhas que começam com LJ

LC_ALL=pt_BR awk --use-lc-numeric -F';' '/^LJ/ {n+=$2} END {print n}' lista.txt


Agora o que eu entendi é que você quer sub-totais, somando a cada duas?

Obs: usei o LC_ALL=pt_BR para fazer a vírgula como separador decimal, pois o default é o ponto


6. Re: Somando valores com introdução de linhas

Fernando
phoemur

(usa Debian)

Enviado em 19/08/2013 - 20:20h

O que eu entendi é que você quer adicionar a soma após cada bloco semelhante a esse do arquivo lista.txt:

Co-SR:N_D;-32,3234
LJ-SR:N_D;-32,6946
LJ-LR:N_D;-0,463281


Desta forma eu consegui assim:

Primeiro criaremos um novo arquivo lista_nova.txt com as legendas como você queria. Aqui coloquei a legenda como Soma=%bla , sendo que o %bla será substituido depois pelos numeros. Troque de acordo com o q vc quiser.

sed "/LJ-LR:/a\Soma=%bla" lista.txt > lista_nova.txt


Depois criaremos um arquivo somas.txt somando a cada 2 ocorrências de LJ, uma variante do comando que eu passei no post anterior:

LC_ALL=pt_BR awk --use-lc-numeric -F';' '/^LJ/ {n+=$2} (NR%3)==0{print n; n=0;}' lista.txt > somas.txt


E agora o pulo do gato, que é substituir os %bla pela linha correspondente do arquivo soma.
Aqui tive que utilizar o eval para expandir a variável. O eval é um comando bastante incompreendido do linux.

cat somas.txt | while read LINE; do eval "sed -i '0,/%bla/s//$LINE/' lista_nova.txt"; done


Pelo menos no trecho de arquivo que você passou funcionou direito... O arquivo lista_nova.txt já vai estar com as somas inseridas nas linhas novas...
Aqui no meu ficou assim:

Co-SR:N_D;-32,3234
LJ-SR:N_D;-32,6946
LJ-LR:N_D;-0,463281
Soma=-33,1579
Co-SR:r_13;0
LJ-SR:r_13;0
LJ-LR:r_13;-0,01999
Soma=-0,01999
Co-SR:r_14;-0,000863515
LJ-SR:r_14;-0,00429348
LJ-LR:r_14;-0,0669857
Soma=-0,0712792
Co-SR:r_15;0
LJ-SR:r_15;0
LJ-LR:r_15;-0,0252353
Soma=-0,0252353


Dá um retorno aí se funcionou do jeito que você queria...
Aprendi bastante coisa hoje com esse seu problema viu....rs


7. Re: Somando valores com introdução de linhas

camilo lima
camilolima

(usa Ubuntu)

Enviado em 20/08/2013 - 01:07h

Ficou perfeito Phoemur!

Fiz algumas alterações nas linhas de comando pois o "LC_ALL=pt_BR awk --use-lc-numeric" estava dando erro.

sed -e '/LJ-LR:/a\Soma=%bla' -e 's/\,/./g' lista.txt > lista_nova.txt
awk -F';' '/^LJ/ {n+=$2} (NR%3)==0{print n; n=0;}' lista_nova.txt > somas.txt
cat somas.txt | while read LINE; do eval "sed -i '0,/%bla/s//$LINE/' lista_nova.txt"; done


Minha última duvida é sobre a substituição da legenda "soma=" por "LJ:nome" por exemplo:

Co-SR:N_D;-32,3234
LJ-SR:N_D;-32,6946
LJ-LR:N_D;-0,463281
LJ:N_D;-33,1579
Co-SR:r_13;0
LJ-SR:r_13;0
LJ-LR:r_13;-0,01999
LJ:r_13;-0,01999
Co-SR:r_14;-0,000863515
LJ-SR:r_14;-0,00429348
LJ-LR:r_14;-0,0669857
LJ:r_14;-0,0712792

Eu sei que utilizando o comando sed consigo substituir a legenda, mas como faria para retornar parte da legenda anterior?

Muito obrigado!


8. Re: Somando valores com introdução de linhas

Fernando
phoemur

(usa Debian)

Enviado em 20/08/2013 - 22:01h

É só trocar o Sed...
Agora um detalhe importante é que você não pode extrair o somas.txt da lista_nova e sim da lista original, pois estava dando erro, já que o arquivo lista_nova agora vai ter uma linha a mais começando com LJ...


Faz assim que não tem erro:



sed -i 's/\,/./g' lista.txt
sed -e '/LJ-LR:/s/LJ-LR:\(.*\);.*$/&\nLJ:\1;%bla/g' lista.txt > lista_nova.txt
awk -F';' '/^LJ/ {n+=$2} (NR%3)==0{print n; n=0;}' lista.txt > somas.txt
cat somas.txt | while read LINE; do eval "sed -i '0,/%bla/s//$LINE/' lista_nova.txt"; done


Saída:

phoemur ~/bash/teste $ cat lista_nova.txt
Co-SR:N_D;-32.3234
LJ-SR:N_D;-32.6946
LJ-LR:N_D;-0.463281
LJ:N_D;-33.1579
Co-SR:r_13;0
LJ-SR:r_13;0
LJ-LR:r_13;-0.01999
LJ:r_13;-0.01999
Co-SR:r_14;-0.000863515
LJ-SR:r_14;-0.00429348
LJ-LR:r_14;-0.0669857
LJ:r_14;-0.0712792
Co-SR:r_15;0
LJ-SR:r_15;0
LJ-LR:r_15;-0.0252353
LJ:r_15;-0.0252353


Não esquece de fazer o dever de casa e estudar um pouco de sed e awk pra entender o que foi feito aqui...rs
Abraços






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts