AA制消费金额统计的Bash脚本
什么是AA制?
百度百科 AA制 写道
AA制是源于大中华地区的词汇,意思是各人平均分担所需费用,通常用于饮食聚会及旅游等场合。“AA”是
“Algebraic
Average”的缩写。意思是“代数平均”。意思可以从字面看出,就是按人头平均分担帐单的意思。这个意思首先来自英国人对荷兰人的偏见,因为古荷兰人
就是平分帐单的,英国人认为荷兰人没有绅士风度。因为在古英语中与荷兰有关的东西大部分都是贬义的。但AA制还有其他说法,比如香港人把AA作为All
Apart的缩写,意为“全部分开”。还有人认为“AA”是英文“Acting Appointment”的缩写。
消费原始记录文件格式
每次消费记录占一行,第一项是每次的总金额,从第二项开始是消费人员的列表。比如:
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
(转载请注明出处)
分享到:
相关推荐
在Linux操作系统中,Bash(Bourne-Again SHell)是默认的命令行解释器,也是编写脚本的强大工具。对于系统管理员和开发者来说,掌握高级Bash脚本编程技巧是提高工作效率的关键。这份“高级Bash脚本编程指南”涵盖了...
"Bash脚本编写教程简易教" 本文将对Bash脚本编写进行详细的讲解,涵盖了基本概念、变量、命令和流程控制等方面的知识点。 基本概念 在Linux系统中,有多种不同的shell,但是通常我们使用Bash(bourne again shell...
在IT领域,Bash脚本是一种非常实用的工具,尤其对于系统管理员和自动化任务执行者而言。《高级Bash脚本编程指南》是一本深入探讨Bash编程的资源,提供了丰富的示例和详尽的解释。以下是根据提供的压缩包文件名所涉及...
"高级Bash脚本编程指南"是一本深入讲解Bash脚本编程的权威资料,其Doc转pdf高清版为学习者提供了方便的阅读体验。这本书涵盖了从基础到高级的多个层次,旨在帮助读者提升在Linux环境中使用Bash编写高效、可靠脚本的...
高级Bash脚本编程指南
### Linux中高效编写Bash脚本的9个技巧 #### 1. 在脚本中多写注释 注释在任何编程语言中都是至关重要的,它们帮助开发者理解代码的功能和目的。在Bash脚本中,注释同样非常重要,尤其是在团队环境中或者当你未来...
在IT领域,Bash Shell脚本编程是一种非常实用的技能,尤其对于系统管理员和自动化任务的执行者来说。Bash是Unix和Linux操作系统中的默认Shell,它的全称是Bourne-Again SHell,是对经典的Bourne Shell的增强版。这...
根据提供的文件内容,这份文档是关于阮一峰所编写的Bash脚本教程,主要涉及Linux命令行环境下Bash的基本用法和脚本编程。下面将详细介绍文档中提及的知识点: 1. Bash简介: - Bash(Bourne Again SHell)是Unix...
【Bash脚本编写教程】深入讲解 Bash(Bourne-Again SHell)是Linux和Unix系统中最常用的Shell之一,它提供了丰富的命令行工具和脚本编程能力。对于初学者来说,学习Bash脚本编写是非常有价值的,因为这能帮助你自动...
### Linux Bash脚本大全知识点概览 #### 一、引言 - **Shell的重要性:** Shell作为用户与操作系统之间的交互接口,在Linux/UNIX系统中扮演着极其重要的角色。特别是Bash(Bourne Again Shell),它是当前最流行的...
《Linux高级Bash脚本编程指南》:解锁Shell的秘密 一、引言:Shell与Bash的重要性 在Unix/Linux世界中,Shell不仅是操作系统的核心组成部分,更是用户与系统间的重要桥梁。其中,Bash(Bourne Again Shell)作为...
高级 bash 脚本 编程指南 6.0 最新版 2009 高级 bash 脚本 编程指南 6.0 最新版 2009 高级 bash 脚本 编程指南 6.0 最新版 2009
本书《高级Bash脚本编程指南》是一本深入探讨UNIX®/Linux环境下Bash Shell脚本编程的权威指南,由Mendel Cooper所著。全书内容覆盖广泛,旨在为读者提供从基础到高级的Shell编程技能,并假定读者没有任何脚本编程或...