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は安定して使用できる場所はどこですか?これは宿題です…?

しかし、それを行う方法については、これは実際には浮動小数点数学ではなく、2桁の後位精度を使用する固定小数点数学です。したがって、数字を2桁移動し、数学を実行してから結果を再度移動します。

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と同じではないと主張します。

関連情報