AA制消费金额统计的Bash脚本

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   (转载请注明出处)

 

 

用Python的pdfplumber和pandas,5分钟搞定支付宝账单PDF转Excel(附完整代码) 本文介绍如何使用Python的pdfplumber和pandas库,快速将支付宝账单PDF转换为Excel并进行分析。通过简单的代码实现,5分钟内完成PDF表格提取、数据清洗和Excel导出,还能进行收支统计和智能分类识别,大幅提升账单处理效率。 阅读详情

相关推荐

从零搭建数仓:基于Apache Hive的ODS到ADS五层架构实战配置指南(含完整SQL脚本)

本文详细介绍了从零搭建基于Apache Hive的数据仓库五层架构(ODS→DWD→DWS→DWT→ADS)的实战配置指南,包含完整SQL脚本和优化策略。通过环境配置、数据同步、维度建模到报表输出的全流程演示,帮助开发者掌握企业级数仓建设核心技能,提升数据处理效率与分析准确性。

weixin_30920853的博客 433

python函数增强代码可读性_如何提高代码的可读性 学习笔记

本文整理自 taowen 师傅在滴滴内部的分享。1.Why对一线开发人员来说,每天工作内容大多是在已有项目的基础上继续堆代码。当项目实在堆不动时就需要寻找收益来重构代码。既然我们的大多数时间都花在坐在显示器前读写代码这件事上,那可读性不好的代码都是在谋杀自己or同事的生命,所以不如一开始就提炼技巧,努力写好代码; )2.How为提高代码可读性,先来分析代码实际运行环境。代码实际运行于两个地方:cp...

weixin_29442195的博客 585

新手也能玩转!用Panosim+MATLAB/Simulink搭建你的第一个智能驾驶仿真场景(保姆级图文)

本文为新手提供了使用Panosim和MATLAB/Simulink搭建智能驾驶仿真场景的详细教程。从环境准备、基础场景创建到仿真模型构建,一步步指导用户完成第一个智能驾驶仿真项目,帮助零基础用户快速上手并体验智能驾驶仿真的乐趣。

weixin_29090089的博客 179

java中读取propertise文件

今天有人问起怎么在java类中读取资源文件,以前也没有写过,在网上找到了相关资料,所以写了个小例子尝试了下。内容如下: 在com.example包下有一个test.properties文件和一个测试的类ReadProperties 资源文件中的内容为: author=zhuzhuname=zhuzhuschool=zhuzhu     测试的类为: package com.exa...

朱湘鄂 287

OpenEarthMap 与 xBD 数据集合并

整合好的数据:链接: https://pan.baidu.com/s/1uJ_Zg6n-s3u1D49OW52D7Q?pwd=2vwx 提取码: 2vwx完整整合步骤与代码如下。

qq_60293814的博客 1593

西门子交换机环网冗余设置(实战篇2.2)

MRP的重组时间为 200ms 因此 PROFINET 通信必须选择大于 200ms 的看门狗时间,看门狗。ET200SP默认为 2ms*3=6ms) MRP 的重组时间为 200ms 故系统会报出看门狗超时。更新,默认是 3 个周期,超出设置的周期数就会报 IO 设备故障。时间不是直接配置的,而是作为没有 IO 数据可接受的更新周期,也就是允许几个周期没有数据。来达到大于 200ms 的看门狗时间的要求(看门狗时间 可接受更新周期数 更新时间)。是IO 控制器和 IO 设备)

weixin_42580591的博客 364

一个简单的统计脚本

1.需求描述   商店服务BuyItemServer会根据玩家购买游戏道具的请求打印后台按天日志,记录玩家购买的道具种类、数量和付费类型等,产品需要统计某个时期内某分区内玩家的消费情况,列出每个区RMB消费总额前5000名的名单,分别发放奖励。   该按天日志的文件名格式如下:        日志内容格式如下所示:      其中第3个字段表示用户号码,第4个字段是分区号,第5个字段是...

weixin_30435261的博客 221

PyTorch版Unet训练后别只看loss:手把手教你计算并可视化多类别语义分割的mIoU(附完整代码)

本文详细介绍了在PyTorch中使用Unet模型进行多类别语义分割后,如何计算和可视化mIoU(mean Intersection over Union)以全面评估模型性能。通过完整的代码示例和实用技巧,帮助开发者从loss优化转向更精准的区域分割评估,特别适用于医学图像分析等关键场景。

weixin_30906185的博客 435

脚本练习_比较长

#!/bin/bash ## 功能:自动生成两个文件 ,文件一以空格为分隔符 ,第一列为手机号码 ,第二列为话费金额 ##                          文件二以空格为分隔符 ,第一列为手机号码 ,第二列为流量金额 ##       其中 ,文件一、二中的手机号码相同、并且一一对应 ,金额不同 ## 要求:1、打印出话费金额最大的手机号码跟话费消费金额 #

小怪兽 680

Apache-Plc4x-Modbus-Tcp学习记录(一)

Apache-Plc4x-Modbus-Tcp学习记录(一)

weixin_45325423的博客 6987

【永磁同步电机】simulink永磁同步电机PMSM矢量控制【含Matlab源码 7372期】

simulink永磁同步电机PMSM矢量控制 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 1028

shell-----简单商城平台购物脚本---循环、条件的混合使用

代码如下: #!/bin/bash #提前定义商品、价格,方便后序编写 A="外套" B="裤子" C="鞋子" D="帽子" a=500 b=400 c=300 d=200 sum=0 count=0 #设置标题 echo -e "\033[5;46;30m----------------------\033[0m" echo "欢迎进入商场购物平台 " echo -e "\033[5;...

qq_42761527的博客 582

基于Simulink的电机功率因数校正仿真

PF=SP​=视在功率有功功率​=cosϕ⋅Irms​I1​​(非正弦时)位移因数(cosϕ):基波电压电流相位差畸变因数(I1​/Irms​):谐波导致电流有效值增大本文带你完成了电机系统功率因数校正的Simulink仿真,实现了:✅ 理解了低功率因数的成因与危害✅ 搭建了无PFC、无源PFC、有源PFC三种对比模型✅ 掌握了Vienna整流器建模与dq解耦控制方法✅ 实现了PF与THD的自动计算与评估✅ 验证了有源PFC在PF、THD、稳定性上的全面优势。

amy_mhd的博客 154

shell脚本(shopping小游戏)

需求:共有5家商店,逐个逛,买商品则打印商品信息,记录每次购买的金额。逛完5家商店给予总金额输出分析:大循环逛5家商店,小循环询问是否购买商品,每次买完,对商品价格累加。#!/bin/bash #打印商品价格函数 info(){ printf"Pricelist 1、hat50¥ 2、shoes200¥...

bawei5098的博客 350

Android Input——输入事件ANR执行(十六)

上一篇文章我们介绍了输入事件 ANR 的触发流程,这里我们再来看一下输入事件 ANR的执行流程。

小旭的专栏 942

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

mysql计算订单总金额_多级分销情况下实时计算订单总金额(Flume+kafka+storm+mysql)

1.flume配置创建一个文件,flume监听这个文件,代替kafka生产者向消费者传输内容,具体配置如下###############给sinnsource、channel起名字###############akafka_agent.sources = kafka_sourcekafka_agent.sinks = kafka_sinkkafka_agent.channels = kafka_c...

weixin_34375356的博客 808

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

互联网电商大数据环境 ——大数飓数据分析实践培训精华笔记(八)——电商核心业务知识之订单商品模块三

订单指标表计算 #!/bin/bash #====== #dm_b2c_orders_goods.sh    这里用shell来调用SQL #订单指标表计算 #====== DT=`date  -d  '-1 day'  "+%Y-%m-%d" ` 注意date  -d ‘-1 day’表示取前一天 或者sysdate=`date "+%Y-%m-%d"`脚本传参数法

houxiaoqin的博客 2071

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

阿里云通过接口统计每日账单

【代码】阿里云通过接口统计每日账单。

完颜振江 463

Linux作业5

read -p "请输入起始时间(YYYY-MM-DD): " start_date。read -p "请输入截止时间(YYYY-MM-DD): " end_date。echo "============== 记账系统 =============="read -p "请输入统计月份(MM): " month。read -p "消费时间(YYYY-MM-DD): " date。read -p "消费时间(YYYY-MM-DD): " date。read -p "请输入要删除的账务信息的行号: " line。

m0_75045029的博客 93

mysql分类并计算总额_多级分销情况下实时计算订单总金额(Flume+kafka+storm+mysql)

1.flume配置创建一个文件,flume监听这个文件,代替kafka生产者向消费者传输内容,具体配置如下###############给sinnsource、channel起名字###############akafka_agent.sources = kafka_sourcekafka_agent.sinks = kafka_sinkkafka_agent.channels = kafka_c...

weixin_30072453的博客 458

电商用户分群实战:LRFM+K-Means 聚类挖掘高价值用户(完整代码 + 分析)

技术层面:完整实现了数据清洗→可视化分析→特征工程→标准化→K-Means 聚类全链路数据分析流程,掌握 LRFM 模型与无监督聚类在业务中的落地用法;业务层面:通过数据量化用户价值,实现精细化用户分层,告别粗放式营销,为电商精准运营提供数据支撑;拓展方向:可增加用户地域、商品品类特征做多维度聚类,也可结合分类算法构建用户流失预测模型。

hzl6030604的博客 266

多级分销情况下实时计算订单总金额(Flume+kafka+storm+mysql)

1.flume配置 创建一个文件,flume监听这个文件,代替kafka生产者向消费者传输内容,具体配置如下 ###############给sinnsource、channel起名字###############a kafka_agent.sources = kafka_source ...

chima2710的博客 440

指定起始日期,构造时间数据

select Date,ISNULL(NewFans,0) NewFans,ISNULL(NewMembers,0) NewMembers, ISNULL(NewBinds,0) NewBinds, ISNULL(Recharges,0) Recharges, ISNULL(Consume,0...

oopts的博客 325

OpenClaw+GLM-4.7-Flash:个人财务管理自动化方案

本文介绍了如何在星图GPU平台上自动化部署【ollama】GLM-4.7-Flash镜像,实现个人财务管理的智能化解决方案。该方案通过大模型自动解析多平台账单数据,智能分类消费记录,并生成动态预算分析,显著提升个人财务管理效率。典型应用场景包括自动识别消费类型、预警超额支出等。

weixin_36231030的博客 293

数据仓库分层重构实录:用 dbt + Airflow 替换手写 Spark 脚本,ETL 开发效率翻倍

这次重构让我重新理解了一件事:数据仓库不是"把数据存起来",而是"把数据的逻辑关系显式化"。手写 Spark 脚本的问题,从来不在 Spark 本身。问题在于,200 个脚本之间的依赖和逻辑,只存在写它的人的脑子里。dbt 的ref()和source(),Airflow 的 DAG 边,本质上都是在做同一件事:把隐式知识变成显式结构。这不是炫技。当凌晨 3 点收到告警,你能打开一张 DAG 图,一眼看出哪层挂了、影响了谁、该从哪里恢复——这种踏实感,比什么"效率翻倍"都值钱。

聚焦学生开发者需求,分享课设毕设项目实战经验、系统开发技巧、数据库设计规范及文档排版实用方法。 298
上一篇: 在Linux下怎么一次性删除掉那些修改时间为指定日期的所有文件?
下一篇: Bash字符串处理(与Java对照) - 1.(字符串)变量声明
codingstandards
博客等级 码龄16年 12粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值