somar coluna quando linha for repetida.

1. somar coluna quando linha for repetida.

Paulo Cezar Oliveira
paulocez

(usa Outra)

Enviado em 10/09/2020 - 13:54h

Boa Tarde!

Gostaria de uma ajuda de profissionais sobre uma questão usando o comando awk para resolver o seguinte problema.
tenho um arquivo texto contendo 3 colunas:

7895555075770;1,0000;40,00
7895555075770;1,0000;84,90

Sendo: EAN, quantidade e valor respectivamente;
Gostaria de eliminar a linha com duplicidade na primeira coluna.. Já consigo fazer isso usando o comando:
awk -F';' '!seen[$1]++' itens.txt >> itens_final.txt

porem isso vai me exclui a segunda linda sem ao mesmo que eu possa somar a quantidade e o valor da terceira coluna.

gostaria de ter no arquivo final com o seguinte resultado:
7895555075770;2,0000;124,90

Isso é possivel meus amigos usando o comando awk?







  


2. Re: somar coluna quando linha for repetida.

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 10/09/2020 - 18:45h

paulocez escreveu:

Boa Tarde!

Gostaria de uma ajuda de profissionais sobre uma questão usando o comando awk para resolver o seguinte problema.
tenho um arquivo texto contendo 3 colunas:

7895555075770;1,0000;40,00
7895555075770;1,0000;84,90

Sendo: EAN, quantidade e valor respectivamente;
Gostaria de eliminar a linha com duplicidade na primeira coluna.. Já consigo fazer isso usando o comando:
awk -F';' '!seen[$1]++' itens.txt >> itens_final.txt

porem isso vai me exclui a segunda linda sem ao mesmo que eu possa somar a quantidade e o valor da terceira coluna.

gostaria de ter no arquivo final com o seguinte resultado:
7895555075770;2,0000;124,90

Isso é possivel meus amigos usando o comando awk?

Boa tarde Paulo, sim , é "quase" possível.....
Exceto pela ","
Que deve ser alterada para ".", senão o awk não faz a soma....
awk -F";" '{gsub(",",".");qtdd+=$2;vlr+=$3;}END{printf "%s;%.4f;%.2f\n" ,$1,qtdd,vlr}' texto.txt
7895555075770;2.0000;124.90

Caso necessário, pode ser contornado com o "sed"...
______________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________


3. Re: somar coluna quando linha for repetida.

Paulo Cezar Oliveira
paulocez

(usa Outra)

Enviado em 11/09/2020 - 08:33h

msoliver escreveu:

paulocez escreveu:

Boa Tarde!

Gostaria de uma ajuda de profissionais sobre uma questão usando o comando awk para resolver o seguinte problema.
tenho um arquivo texto contendo 3 colunas:

7895555075770;1,0000;40,00
7895555075770;1,0000;84,90

Sendo: EAN, quantidade e valor respectivamente;
Gostaria de eliminar a linha com duplicidade na primeira coluna.. Já consigo fazer isso usando o comando:
awk -F';' '!seen[$1]++' itens.txt >> itens_final.txt

porem isso vai me exclui a segunda linda sem ao mesmo que eu possa somar a quantidade e o valor da terceira coluna.

gostaria de ter no arquivo final com o seguinte resultado:
7895555075770;2,0000;124,90

Isso é possivel meus amigos usando o comando awk?

Boa tarde Paulo, sim , é "quase" possível.....
Exceto pela ","
Que deve ser alterada para ".", senão o awk não faz a soma....
awk -F";" '{gsub(",",".");qtdd+=$2;vlr+=$3;}END{printf "%s;%.4f;%.2f\n" ,$1,qtdd,vlr}' texto.txt
7895555075770;2.0000;124.90

Caso necessário, pode ser contornado com o "sed"...
______________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________


Bom dia

Obrigado pela ajuda.
Sim me deparei com esse problema de virgula, então usei o comando sed -i s/\,/\./g para converter virgula por ponto.

Ontem eu pesquisei muito por isso e consegui a seguinte expressão
gawk -F ";" -v OFS=";" "{a[$1]+= $2} {b[$1]+= $3;} END{for (i in a) print i, a[i],b[i]/a[i]} " itens.txt > itens1.txt
onde em um arquivo como esse:
7895555075770;2;62.45
7895555075770;2;40.45
7895555075771;2;62.45

obtenho esse
7895555075770;4;25.725
7895555075771;2;31.225

to com 90% do meu problema\a resolvido, porém na anunciação desse tópico eu acabei esquecendo o seguinte:
- Na terceira coluna eu preciso que seja somado a quantidade e depois dividido pela quantidade da segunda coluna.
No script que encontrei ele até faz certinho quando encontra mais de uma linha repetida, porem quando não tem nenhum dado repetido ele divide mesmo assim, como mostra o resultado acima. onde a linha 7895555075771;2;62.45 gostaria que me apresentasse o mesmo resultado, pois não tem outra linha igual, ao invés disso ele divide 62.45 por 2 resultando em 7895555075771;2;31.225.

Conseguiram entender o meu problema?

















4. Re: somar coluna quando linha for repetida.

me
meteoro17

(usa Outra)

Enviado em 11/09/2020 - 10:10h

Dê uma olhada neste blog abaixo..
O cara é especialista em awk e conferência de dados.

Um dos posts dele que eu vi ontem, o cara faz média
móvel de 5 pontos com awk.

Ou seja, lá tem muitas técnicas dele com awk,
quem sabe você acha alguma coisa..
https://www.datafix.com.au/BASHing/


5. Re: somar coluna quando linha for repetida.

Paulo Cezar Oliveira
paulocez

(usa Outra)

Enviado em 11/09/2020 - 15:45h

Boa Tarde Comunidade!

Depois de horas tentando fazer funcionar o que eu queria, finalmente eu consegui e por isso quero aqui compartilhar com os amigos.

Como citado no post anterior, eu gostaria de somar e dividir dados de uma coluna como no exemplo abaixo:

7895555075770;2,0000;40.00
7895555075770;1,0000;84.90
onde a primeira coluna é EAN, quantidade e valor unitário. A ideia é eliminar as linhas repetidas porém somar a coluna quantidade e somar também a coluna valor unitário multiplicado pela quantidade.

ficando assim:
7895555075770;3,0000;54.96 (2x40 = 80 | 1x84,90 = 84,90 | 80 + 84,90 = 164,90 | 164,90 / 3(quantidade somada) = 54,96 (valor unitário médio)
então de tanto bater a cabeça consegui o seguinte script com awk
awk -F ";" -v OFS=";" "{a[$1]+= $2}{b[$1]+=$3*$2}{c[$1]+=1}{d[$1]+=$3} END{for (i in a) {if (c[i]==1) {print i, a[i],d[i]}else{print i,a[i],b[i]/a[i]}}}" itens.txt > itens1.txt

com isso quero encerrar o tópico!
Agradeço aos que tentaram me ajudar de alguma forma.

Grato!!












6. Re: somar coluna quando linha for repetida.

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 11/09/2020 - 16:14h


paulocez escreveu:

Boa Tarde Comunidade!

Depois de horas tentando fazer funcionar o que eu queria, finalmente eu consegui e por isso quero aqui compartilhar com os amigos.

Como citado no post anterior, eu gostaria de somar e dividir dados de uma coluna como no exemplo abaixo:

7895555075770;2,0000;40.00
7895555075770;1,0000;84.90
onde a primeira coluna é EAN, quantidade e valor unitário. A ideia é eliminar as linhas repetidas porém somar a coluna quantidade e somar também a coluna valor unitário multiplicado pela quantidade.

ficando assim:
7895555075770;3,0000;54.96 (2x40 = 80 | 1x84,90 = 84,90 | 80 + 84,90 = 164,90 | 164,90 / 3(quantidade somada) = 54,96 (valor unitário médio)
então de tanto bater a cabeça consegui o seguinte script com awk
awk -F ";" -v OFS=";" "{a[$1]+= $2}{b[$1]+=$3*$2}{c[$1]+=1}{d[$1]+=$3} END{for (i in a) {if (c[i]==1) {print i, a[i],d[i]}else{print i,a[i],b[i]/a[i]}}}" itens.txt > itens1.txt

com isso quero encerrar o tópico!
Agradeço aos que tentaram me ajudar de alguma forma.

Grato!!

Paulo, de uma verificada neste comando....
awk -F ";" '{X[$1]++} {a[$1]+=$2} {b[$1]+=$3;} END{for (i in a) if(X[i]>1) print i";"a[i]";"b[i]/a[i];else print $0;}' arquivo
7895555075770;4;25.725
7895555075771;2;62.45



______________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts