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
=================================