我有一个包含借方、贷方和取款交易的文件。我需要一个 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。