Começou de uma forma bem simples. Um conjunto de entradas e saídas era sequênciado da seguinte forma:
- o comando cat exibe todo o conteúdo
- o comando cut mostrar do caracter 60 em diante
- o grep exibe somente as linhas de débito (indicadas por um "D")
- o awk exibe somente o primeiro campo da linha de débito
- o comando sed substitui vírgula por ponto
- o paste e suas opções transformam a listagem de coluna para linha e insere um sinal de mais (+) entre os números
- o comando bc faz a soma
Até Maio de 2007 e anterior a esta data, o comando era:
cat extrato_07_05.txt | cut -c 60- | grep D | awk '{printf("%s\n",$1)}' | sed 's/,/./g' | paste -s -d"+" | bc
De Junho de 2007 até o presente, usa-se:
cat extrato_07_06.txt | cut -c 71- | grep D | awk '{printf("%s\n",$1)}' | sed 's/,/./g' | paste -s -d"+" | bc
Estes comandos combinados funcionavam para valores até 999 reais. A partir dos valores contendo 4 dígitos, este é exibido com um ponto separador de milhar. Exemplo: 1.000,00 Como consequência, causa um erro no interpretador do bc. Para resolver o problema, apresento a solução abaixo bem como os comentários.
#!/bin/bash
# Variáveis mes e ano capturam a data
mes=`date +%m`
ano=`date +%Y`
# Exige o número do arquivo ao executar o comando
if [ $# != 1 ]
then
echo "Argumento: nome_de_arquivo"
exit 1
fi
cat $1 | cut -c 71- | grep D | awk '{printf("%s\n",$1)}' | sed 's/,/./g' > extrato.txt
# Conta a quantidade de linhas ao ler o arquivo
total_linhas=`wc -l extrato.txt | cut -f1 -d" "`
# Apaga o arquivo
rm -f gasto_"$ano"_$mes.txt
# Loop para executar um conjunto de ações até o final do arquivo
for i in `seq $total_linhas`
do
# Analisa cada linha e conta o número de pontos (separadores de milhar e da parte fracionária)
um_ponto=`head -n $i extrato.txt | tail -n 1 | tr -cd "." | wc -c`
if [ $um_ponto = 1 ]
then
# Se for apenas 1 ponto, simplesmente exibe o valor
head -n $i extrato.txt | tail -n 1
fi
# Analisa cada linha e conta o número de pontos (separadores de milhar e da parte fracionária)
dois_pontos=`head -n $i extrato.txt | tail -n 1 | tr -cd "." | wc -c`
if [ $dois_pontos = 2 ]
then
# Se forem 2 pontos, substitui o primeiro ponto por nada (ponto aparece somente para parte fracionária)
echo `head -n $i extrato.txt | tail -n 1` | sed 's/\.//'
fi
done >> gasto_"$ano"_$mes.txt
paste -s -d"+" gasto_"$ano"_$mes.txt | bc