Como gravar todas as transações usando o Bash

1

Eu tenho um arquivo com crédito de débito e transações de saque. Eu preciso de um script bash que registra o saldo após cada transação. Então o arquivo é assim:

D:11/02/12:1000.50
C:11/03/12:300
W:11/05/12:95.50
D:11/10/12:125
C:11/20/12:265.50

onde D = débito, C = crédito e W = retirada

A saída precisa ser assim:

11/02/12 1000.50
11/03/12 700.50
11/05/12 605.00

e assim por diante. Eu fiz isso em awk e, mas não consigo descobrir como escrever em bash . Qualquer conselho ou amostra seria muito apreciada.

    
por user2212862 03.04.2013 / 02:08

2 respostas

2

Mantenha-o simples e inteligente

#!/usr/bin/env bash
D_amt=0

[[ $# -eq 0 ]] && { echo -e "Usage\n\t $0 input_file"; exit 1; }

while IFS=':' read type Date amt
do
        case $type in
                D)      D_amt=$( echo $amt + $D_amt | bc ) 
                        echo $Date $D_amt && continue ;;

                C|W)    D_amt=$( echo $D_amt - $amt| bc) 
                        echo $Date $D_amt && continue ;;
        esac

done <$1
    
por 03.04.2013 / 08:09
1

Primeiro a pergunta deve ser respondida se faz sentido fazer isso no bash. Eu realmente duvido disso; quanto mais parece haver uma solução funcional. Onde o awk está indisponível, mas o bash é confiável? Isso é lição de casa ...?

Mas sobre como isso pode ser feito: Isso não é realmente uma matemática de ponto flutuante, mas uma matemática de ponto fixo com precisão de dois dígitos após o ponto. Então, basta deslocar os números por dois dígitos, fazer as contas e mudar o resultado novamente:

shift_100_left () {
  local input output beforep afterp
  input="$1"
  if [ "$input" = "${input//./_}" ]; then
    # no . in it
    output="${input}00"
  else
    beforep="${input%.*}"
    afterp="${input#*.}"
    output="${beforep}${afterp}"
  fi
  output=${output#0}
  output=${output#0}
  echo "$output"
}
shift_100_left 100
shift_100_left 123.75

shift_100_right () {
  local input output beforep afterp length
  input="$1"
  length=${#input}
  if [ 1 -eq "$length" ]; then
    output=0.0${input}
  elif [ 2 -eq "$length" ]; then
    output=0.${input}
  else
    beforep="${input%??}"
    afterp="${input:$((length-2))}"
    output="${beforep}.${afterp}"
  fi
  echo "$output"
}
shift_100_right 1
shift_100_right 12375

Isso afirma que todos os números se parecem com xxx ou yyy.yy, mas nunca como, por exemplo, zzz.z.

    
por 03.04.2013 / 06:19