每次消費記錄佔一行,第一項是每次的總金額,從第二項開始是消費人員的列表。比如:
34 zhy kx zxe
39 zhy kx zxe oyc
36 zhy kx zxe
50 zhy kx zxe oyc
36 zhy kx zxe
對每行資料進行分解,得到總金額,得到人數,每個人的消費金額就是總金額除以人數,對每個人的金額求和。
#!/bin/sh[root@jfht bill]# cat bill20110902.txt# 用法:./calc_bill.sh [discount]
# 折扣,由第乙個引數指定,如果沒有指定就設定為1,即無折扣
# 折扣可以是小數,比如 0.8;也可以是乙個除式,比如 1/1.1 或 10/11
discount=$
# 人員陣列
declare -a ids
# 費用陣列,儲存乙個計算費用的表示式,比如 0+34/3+45/4
declare -a fee
# 在人員陣列ids中查詢人員,如果沒有查到就增加,將位置通過退出碼返回
find_or_add_id()
for ((i = 0; i < n; ++i))
doif [ "$" == "$1" ]; then
return $i
fidone
ids[n]=$1
fee[n]=0
return $n
}# 讀取資料並處理
# 資料格式:每行一條記錄,第一項是總金額,第二項開始時消費人員的名單
while read -a data
do amt=$ # 總金額
if [ ! "$amt" ]; then continue; fi
declare -i num=$-1 # 消費人員的數量
echo "$num $"
for id in "$" # 對每乙個人員進行處理
dofind_or_add_id "$id"
index=$?
#echo "index of $id is $index"
fee[index]="$+$amt/$num"
done
#declare -p ids
#declare -p fee
done
echo
# 列印並計算每個人的消費金額
# 格式:人員 金額
for ((i = 0; i < $; ++i))
do #echo "$" "$(echo "scale=2; ($)*$discount" | bc)"
printf "%-4s %8s\n" "$" "$(echo "scale=4; ($)*$discount" | bc)"
done
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
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
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]#
Mysql 查詢統計不同型別的訂單繳費金額和筆數
select coalesce sum case when order state 1 then paid amount else 0 end 0 errsummoney,coalesce sum case when order state 2 then paid amount else 0 end...
統計主要供應商供貨數量和金額的比例一
如何通過金蝶分析一段時間 主要 各 商供貨數量和金額佔 主要 商總數量和總金額的比例。select distinct select sum fauxqty from icstockbill v1 inner join icstockbillentry u1 on v1.finterid u1.fin...
統計二進位制中1的個數
題目 統計乙個無符號數中的二進位制表示中1的個數。此演算法名為平行計算法。基本思想如下 先兩兩 兩個二進位制位 分組統計每組出現的1的個數,而每組1的個數只可能是0個 00 1個 01 或2個 10 由 相加所得的 兩位的二進位制完全可以表示每組 兩個二進位制數 中1的個數 接著四四 4個二進位制位...