デビット、クレジット、および引き出し取引を含むファイルがあります。各取引後の残高を記録するには、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と同じではないと主張します。