當前位置:
首頁 > 知識 > 用 AWK 喝咖啡

用 AWK 喝咖啡

用 AWK 喝咖啡

打開今日頭條,查看更多圖片

用一個簡單的 AWK 程序跟蹤你的同事喝咖啡的欠款。

-- Moshe Zadka

以下基於一個真實的故事,雖然一些名字和細節有所改變。


很久以前,在一個遙遠的地方,有一間廟(劃掉)辦公室。由於各種原因,這個辦公室沒有購買速溶咖啡。所以那個辦公室的一些人聚在一起決定建立「咖啡角」。

咖啡角的一名成員會購買一些速溶咖啡,而其他成員會付給他錢。有人喝咖啡比其他人多,所以增加了「半成員」的級別:半成員每周允許喝的咖啡限量,並可以支付其它成員支付的一半。

管理這事非常操心。而我剛讀過《Unix 編程環境》這本書,想練習一下我的 AWK 編程技能,所以我自告奮勇創建了一個系統。

第 1 步:我用一個資料庫來記錄成員及其應支付給咖啡角的欠款。我是以 AWK 便於處理的格式記錄的,其中欄位用冒號分隔:


member:john:1:22

member:jane:0.5:33

member:pratyush:0.5:17

member:jing:1:27

上面的第一個欄位標識了這是哪一種行(member)。第二個欄位是成員的名字(即他們的電子郵件用戶名,但沒有 @ )。下一個欄位是其成員級別(成員 = 1,或半會員 = 0.5)。最後一個欄位是他們欠咖啡角的錢。正數表示他們欠咖啡角錢,負數表示咖啡角欠他們。

第 2 步:我記錄了咖啡角的收入和支出:


payment:jane:33

payment:pratyush:17

bought:john:60

payback:john:50

Jane 付款 $33,Pratyush 付款 $17,John 買了價值 $60 的咖啡,而咖啡角還款給 John $50。

第 3 步:我準備寫一些代碼,用來處理成員和付款,並生成記錄了新欠賬的更新的成員文件。


#!/usr/bin/env --split-string=awk -F: -f

釋伴行(#!)需要做一些調整,我使用 env 命令來允許從釋伴行傳遞多個參數:具體來說,AWK 的 -F 命令行參數會告訴它欄位分隔符是什麼。

AWK 程序就是一個規則序列(也可以包含函數定義,但是對於這個咖啡角應用來說不需要)

第一條規則讀取該成員文件。當我運行該命令時,我總是首先給它的是成員文件,然後是付款文件。它使用 AWK 關聯數組來在 members 數組中記錄成員級別,以及在 debt 數組中記錄當前欠賬。


$1 == "member" {

members[$2]=$3

debt[$2]=$4

total_members += $3

}

第二條規則在記錄付款(payment)時減少欠賬。


$1 == "payment" {

debt[$2] -= $3

}

還款(payback)則相反:它增加欠賬。這可以優雅地支持意外地給了某人太多錢的情況。


$1 == "payback" {

debt[$2] += $3

}

最複雜的部分出現在有人購買(bought)速溶咖啡供咖啡角使用時。它被視為付款(payment),並且該人的債務減少了適當的金額。接下來,它計算每個會員的費用。它根據成員的級別對所有成員進行迭代並增加欠款


$1 == "bought" {

debt[$2] -= $3

per_member = $3/total_members

for (x in members) {

debt[x] += per_member * members[x]

}

}

END 模式很特殊:當 AWK 沒有更多的數據要處理時,它會一次性執行。此時,它會使用更新的欠款數生成新的成員文件。


END {

for (x in members) {

printf "%s:%s:%s
", x, members[x], debt[x]

}

}

再配合一個遍歷成員文件,並向人們發送提醒電子郵件以支付他們的會費(積極清賬)的腳本,這個系統管理咖啡角相當一段時間。



via: https://opensource.com/article/19/2/drinking-coffee-awk

作者: Moshe Zadka 選題: lujun9972 譯者: wxy 校對: wxy

本文由 LCTT 原創編譯, Linux中國 榮譽推出


點擊「了解更多」可訪問文內鏈接

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Linux技術 的精彩文章:

極客漫畫:Windows 更新

TAG:Linux技術 |