如何使用 Bash 记录每笔交易

如何使用 Bash 记录每笔交易

我有一个包含借方、贷方和取款交易的文件。我需要一个 bash 脚本来记录每笔交易后的余额。所以文件是这样的:

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

其中 D = 借方,C = 贷方,W = 提款

输出需要是这样的:

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

等等。我已经在 中完成了awk,但不知道如何在 中写入bash。任何建议或样品将不胜感激。

答案1

保持简单和智能

#!/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

答案2

首先应该回答在 bash 中这样做是否有意义的问题。我真的很怀疑;更多,因为似乎有一个可行的解决方案。哪里 awk 不可用但 bash 可靠可用?这是作业吗……?

但关于如何做到这一点:这并不是真正的浮点数学,而是具有两位数后精度的定点数学。因此,只需将数字移动两位数,进行数学计算并再次移动结果:

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

这断言所有数字看起来都像 xxx 或 yyy.yy,但绝不像 zzz.z。

相关内容