AA制消费金额统计的Bash脚本
什么是AA制?
消费原始记录文件格式
每次消费记录占一行,第一项是每次的总金额,从第二项开始是消费人员的列表。比如:
34 zhy kx zxe
39 zhy kx zxe oyc
36 zhy kx zxe
50 zhy kx zxe oyc
36 zhy kx zxe
脚本实现思路
对每行数据进行分解,得到总金额,得到人数,每个人的消费金额就是总金额除以人数,对每个人的金额求和。
本文所提供的脚本是采用纯粹的Bash方式,对于数据处理,更好的方式是采用awk来进行,欢迎有兴趣的朋友尝试实现一下。
Bash脚本 calc_bill.sh
#!/bin/sh
# 用法:./calc_bill.sh [discount]
# 折扣,由第一个参数指定,如果没有指定就设置为1,即无折扣
# 折扣可以是小数,比如 0.8;也可以是一个除式,比如 1/1.1 或 10/11
discount=${1:-1}
# 人员数组
declare -a ids
# 费用数组,保存一个计算费用的表达式,比如 0+34/3+45/4
declare -a fee
# 在人员数组ids中查找人员,如果没有查到就增加,将位置通过退出码返回
find_or_add_id()
{
n=${#ids[@]}
for ((i = 0; i < n; ++i))
do
if [ "${ids[i]}" == "$1" ]; then
return $i
fi
done
ids[n]=$1
fee[n]=0
return $n
}
# 读取数据并处理
# 数据格式:每行一条记录,第一项是总金额,第二项开始时消费人员的名单
while read -a data
do
amt=${data[0]} # 总金额
if [ ! "$amt" ]; then continue; fi
declare -i num=${#data[@]}-1 # 消费人员的数量
echo "$num ${data[@]}"
for id in "${data[@]:1}" # 对每一个人员进行处理
do
find_or_add_id "$id"
index=$?
#echo "index of $id is $index"
fee[index]="${fee[index]}+$amt/$num"
done
#declare -p ids
#declare -p fee
done
echo
# 打印并计算每个人的消费金额
# 格式:人员 金额
for ((i = 0; i < ${#ids[@]}; ++i))
do
#echo "${ids[i]}" "$(echo "scale=2; (${fee[i]})*$discount" | bc)"
printf "%-4s %8s\n" "${ids[i]}" "$(echo "scale=4; (${fee[i]})*$discount" | bc)"
done
执行示例
[root@jfht bill]# cat bill20110902.txt
34 zhy kx zxe
39 zhy kx zxe oyc
36 zhy kx zxe
50 zhy kx zxe oyc
36 zhy kx zxe
[root@jfht bill]# ./calc_bill.sh 10/11 <bill20110902.txt
3 34 zhy kx zxe
4 39 zhy kx zxe oyc
3 36 zhy kx zxe
4 50 zhy kx zxe oyc
3 36 zhy kx zxe
zhy 52.3484
kx 52.3484
zxe 52.3484
oyc 20.2272
[root@jfht bill]# ./calc_bill.sh <bill20110902.txt 10/11
3 34 zhy kx zxe
4 39 zhy kx zxe oyc
3 36 zhy kx zxe
4 50 zhy kx zxe oyc
3 36 zhy kx zxe
zhy 52.3484
kx 52.3484
zxe 52.3484
oyc 20.2272
[root@jfht bill]#
本文链接:http://codingstandards.iteye.com/blog/1164630 (转载请注明出处)
本文提供了一个Bash脚本来处理AA制消费记录,计算每个人应承担的金额。通过解析输入的消费记录文件,脚本计算出每个参与者的消费总额,并根据指定的折扣率计算出最终每人需支付的金额。
549

被折叠的 条评论
为什么被折叠?



