Coisa Simples

1. Coisa Simples

fernando moreira
moreira854

(usa Ubuntu)

Enviado em 29/08/2011 - 18:52h

Tenho um arquivo com 8 tabulações preciso só unir as linhas as quais tem dois determinados campos iguais e somar um dos campos para ter um total, pode ser com o awk.. sed.. qualque coisa.. tentei com dois while mas nao tive muito sucesso.
Agradeço


  


2. Juntar linhas de determinados campos ig

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 29/08/2011 - 19:11h

Tem um pedaço do arquivo com algumas linhas de exemplo ?


3. Re: Coisa Simples

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 29/08/2011 - 19:39h

Mostra também o que você tentou, assim podemos caminhar numa solução juntos, pois existem inúmeras formas de chegar ao mesmo resultado, e chegando ao resultado todas podem ser consideradas formas corretas, algumas com muitas linhas outras com apenas uma :-)


4. Coisa Simples 2

fernando moreira
moreira854

(usa Ubuntu)

Enviado em 30/08/2011 - 08:25h

Sim tenho, o arquivo é o seguinte:
030 0107327 0 08260 201109 201109 8057 0 0
030 0107335 0 08150 201109 201109 4565 0 0
030 0107384 0 08150 201109 201109 26460 0 0
030 0107418 0 08150 201109 201109 1767 0 0
030 0107418 0 08260 201109 201109 72489 0 0
precisaria unir em apenas uma linha caso repetisse por exemplo o 2º campo e o 4º campo somando o valor do 7º campo.
fiz assim:

#!/bin/bash

num_linha=0

while read Linha; do

empresa=`echo $Linha | cut -d" " -f1`
mat_empregado=`echo $Linha | cut -d" " -f2`
data_admissao=`echo $Linha | cut -d" " -f3`
cod_evento=`echo $Linha | cut -d" " -f4`
data_inicio=`echo $Linha | cut -d" " -f5`
data_fim=`echo $Linha | cut -d" " -f6`
valor=`echo $Linha | cut -d" " -f7`
total_parcelas=`echo $Linha | cut -d" " -f8`
numero_parcela=`echo $Linha | cut -d" " -f9`
num_linha=`echo $num_linha+1| bc -l`

while read Linha2; do
num_linha2=`echo $num_linha2+1| bc -l`
mat_empregado2=`echo $Linha2 | cut -d" " -f2`
cod_evento2=`echo $Linha2 | cut -d" " -f4`
valor2=`echo $Linha2 | cut -d" " -f7`
valor=`echo ${valor}p | dc`
valor2=`echo ${valor2}p | dc`

if [[(((${mat_empregado2} = ${mat_empregado}) && (${cod_evento} = ${cod_evento2})) && (${num_linha}!=${num_linha2}))]]
then
valor=$[$valor+$valor2]
fi

sed -i ${num_linha2}d saida_linhas_repetidas.txt

done < saida_linhas_repetidas.txt

echo "${empresa} ${mat_empregado} ${data_admissao} ${cod_evento} ${data_inicio} ${data_fim} ${valor} ${total_parcelas} ${numero_parcela}" >> tss.txt

done < saida_linhas_repetidas.txt



5. Re: Coisa Simples

Alexandre Gonçalves Monteiro da Silva
alexandregms

(usa Ubuntu)

Enviado em 30/08/2011 - 18:46h

Executei seu script aqui, mas nao entendi exatamente o que vc quer. Se puder explique com mais detalhes tudo o q vc quer..


6. Mais específico

fernando moreira
moreira854

(usa Ubuntu)

Enviado em 30/08/2011 - 19:51h

Seria ler o seguinte arquivo por exemplo,

030 0107327 0 08260 201109 201109 8057 0 0
030 0107335 0 08150 201109 201109 4565 0 0 >>essa
030 0107384 0 08150 201109 201109 26460 0 0
030 0107418 0 08150 201109 201109 1767 0 0
030 0107418 0 08260 201109 201109 72489 0 0
030 0107335 0 08150 201109 201109 2 0 0 >>essa

verificar que o 2º e o 4º campo se repetem em linhas diferentes, e juntar essas duas linhas somando os valores do 7º campo. ficaria assim nesse caso:

030 0107327 0 08260 201109 201109 8057 0 0
030 0107335 0 08150 201109 201109 4567 0 0
030 0107384 0 08150 201109 201109 26460 0 0
030 0107418 0 08150 201109 201109 1767 0 0
030 0107418 0 08260 201109 201109 72489 0 0

Preciso de juntar todas as linhas nas quais o 2º e o 4º campo se repetem, somando o valor do 7º campo, o arquivo real é muito maior que esse, e as linhas podem se repetir aleatoriamente.




7. Re: Coisa Simples

Alexandre Gonçalves Monteiro da Silva
alexandregms

(usa Ubuntu)

Enviado em 31/08/2011 - 16:06h

Agora sim da pra fazer! Mas exige um tempo e vou deixar pra depois do expediente!



8. Re: Coisa Simples

DAVISON MARCEL PASQUALINI
fdmarp

(usa Debian)

Enviado em 31/08/2011 - 16:12h

A ordem do arquivo importa? ou eu poderia fazer um sort???


9. Re: Coisa Simples

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 31/08/2011 - 18:32h

Eu fiz o sort para preparar o arquivo:

_SEU_ARQUIVO="${PWD}/exemplo.txt"

_MY_TMP_TRB=$(cat $_SEU_ARQUIVO | sort -k 4,2)

echo $_MY_TMP_TRB > exemplo2.txt

Só que ao salvar fica tudo em uma linha só.
Como fazer para gravar cada linha novamente ?

antes:
=======================
030 0107327 0 08260 201109 201109 8057 0 0
030 0107335 0 08150 201109 201109 4565 0 0 >>essa
030 0107384 0 08150 201109 201109 26460 0 0
030 0107418 0 08150 201109 201109 1767 0 0
030 0107335 0 08150 201109 201109 4565 0 0 >>essa
030 0107418 0 08260 201109 201109 72489 0 0
030 0107335 0 08150 201109 201109 4565 0 0 >>essa
030 0107384 0 08150 201109 201109 26460 0 0
030 0107335 0 08150 201109 201109 2 0 0 >>essa
030 0107418 0 08150 201109 201109 1767 0 0
030 0107418 0 08260 201109 201109 72489 0 0
030 0107335 0 08150 201109 201109 2 0 0
===================================
depois:
========================================
030 0107327 0 08260 201109 201109 8057 0 0 030 0107335 0 08150 201109 201109 2 0 0 030 0107335 0 08150 201109 201109 2 0 0 >>essa 030 0107335 0 08150 201109 201109 4565 0 0 >>essa 030 0107335 0 08150 201109 201109 4565 0 0 >>essa 030 0107335 0 08150 201109 201109 4565 0 0 >>essa 030 0107384 0 08150 201109 201109 26460 0 0 030 0107384 0 08150 201109 201109 26460 0 0 030 0107418 0 08150 201109 201109 1767 0 0 030 0107418 0 08150 201109 201109 1767 0 0 030 0107418 0 08260 201109 201109 72489 0 0 030 0107418 0 08260 201109 201109 72489 0 0
==================
Se eu remontar na mão, a ordem está certa.
====================

030 0107327 0 08260 201109 201109 8057 0 0
030 0107335 0 08150 201109 201109 2 0 0
030 0107335 0 08150 201109 201109 2 0 0 >>essa
030 0107335 0 08150 201109 201109 4565 0 0 >>essa
030 0107335 0 08150 201109 201109 4565 0 0 >>essa
030 0107335 0 08150 201109 201109 4565 0 0 >>essa
030 0107384 0 08150 201109 201109 26460 0 0
030 0107384 0 08150 201109 201109 26460 0 0
030 0107418 0 08150 201109 201109 1767 0 0
030 0107418 0 08150 201109 201109 1767 0 0
030 0107418 0 08260 201109 201109 72489 0 0
030 0107418 0 08260 201109 201109 72489 0 0

tô empacado rsrs.

http://www.linuxsocial.com/dashboard/tab:group/g:scriptshell


10. Soma valor de determinados campos repetidos e + providencias...

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 01/09/2011 - 11:19h

#!/bin/bash
# Soma valores do campo 7 quando campo 2 e campo 4 forem repetidos.
# Elimina linhas repetidas e seus valores acumulados no campo 7.
# Solução iniciada por mim e resolvida pelo Hudson ;)
# Documentando o código para melhor entendimento.
#

r=0

# Monta um matriz de trabalho com os dados do arquivo valores.txt
while read linha;do
matriz[$r]=$linha
r=$(($r + 1))
done < valores.txt

# Cria uma matriz dentro de outra para tratar infos.
for ((i=0;i<=$(($r -1));i++));do

# variável transitória de controle para varredura.
comparador=`cat valores.txt | grep "${matriz[i]:4:7} 0 ${matriz[i]:14:5}" | wc -l`

# Faz verificação para saber se temos um item sem repetição.
# Se conteúdo for apenas 1, não é repetido e já vai para o arq de saída;
if [ $comparador -le 1 ]; then
cat valores.txt | grep "${matriz[i]:4:7} 0 ${matriz[$i]:14:5}" >> saida.txt
else

# Inicializa valor de controle para cálculo.
valor=0

# corre o arquivo inteiro e soma o valor do campo 7.
# Ainda não adiciona ao arquivo de saída.
for i in `cat valores.txt | grep "${matriz[i]:4:7} 0 ${matriz[i]:14:5}" | cut -d" " -f7`; do
valor=$((valor + $i))
done

# Pega os dados do arquivo original mas somente das posições finais.
ajuste=`cat valores.txt | grep "${matriz[i]:4:7} 0 ${matriz[i]:14:5}" | tail -1 | cut -d" " -f1,2,3,4,5,6`

# TODO: Não tenho a menor ideia do que está fazendo rrs.
ajuste2=`cat valores.txt | grep "${matriz[i]:4:7} 0 ${matriz[i]:14:5}" | tail -1 | cut -d" " -f8,9`

# Acrescenta a gravação no arquivo de saida com o resultado correto.
echo $ajuste $valor $ajuste2 >> saida.txt

# pega determinada linha do arquivo e grava no temporário.
# TODO: não entendi como o tmp.txt foi usado.
cat valores.txt | grep -v "${matriz[i]:4:7} 0 ${matriz[i]:14:5}" > tmp.txt

mv tmp.txt valores.txt
fi
done

exit

===============================
arquivo de exemplo:valores.txt
===============================
030 0107327 0 08260 201109 201109 8057 0 0
030 0107335 0 08150 201109 201109 4565 0 0 >>essa
030 0107384 0 08150 201109 201109 26460 0 0
030 0107418 0 08150 201109 201109 1767 0 0
030 0107335 0 08150 201109 201109 4565 0 0 >>essa
030 0107418 0 08260 201109 201109 72489 0 0
030 0107335 0 08150 201109 201109 4565 0 0 >>essa
030 0107384 0 08150 201109 201109 26460 0 0
030 0107335 0 08150 201109 201109 2 0 0 >>essa
030 0107418 0 08150 201109 201109 1767 0 0
030 0107418 0 08260 201109 201109 72489 0 0
030 0107335 0 08150 201109 201109 2 0 0
===================================
arquivo gerado no final:saidas.txt
===================================
030 0107327 0 08260 201109 201109 8057 0 0
030 0107384 0 08150 201109 201109 13699 0 0 (*** erro)
030 0107335 0 08150 201109 201109 3534 0 0
030 0107327 0 08260 201109 201109 8057 0 0
030 0107384 0 08150 201109 201109 13699 0 0 (*** erro)
030 0107335 0 08150 201109 201109 3534 0 0
=================================


11. Re: Coisa Simples

euteste da silva
foxbit3r

(usa Solaris)

Enviado em 01/09/2011 - 13:04h

Isso aqui faz o que vc pede.
Esse aqui tá mega simples pra entender e as linhas podem ser aleatórias.

Boa sorte.

cat prog1.awk
BEGIN {
FS=" "
}
{
str1 = sprintf("%s%s",$2,$4)
arr[str1]+=$7
}
END {
for(i in arr)
if( i in arr)
print arr[i]
}

Para executar é salvar num arquivo chamado prog1.awk
Ai vc chama awk -f prog1.awk entradata.txt
Ou qualquer outro nome.


12. Re: Coisa Simples

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 01/09/2011 - 20:39h

Olá @foxbit3r testei sua solução :)

==========================
8057
52920
3534
144978 **** (diferença)
13699
==========================
Como mostrar os outros campos em cada linha ?
Valores estão perfeitos. ;)







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts