日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

通用線程:Awk 實(shí)例( 十 )


我們將按以下方式將信息記錄到 "mybalance" 中 。數(shù)組的第一維從 0 到 12,用于指定月份,0 代表全年 。第二維是四個字母的分類帳,如 "food" 或 "inco";這是我們處理的真實(shí)分類帳 。因此,要查找全年食品分類帳的余額,應(yīng)查看 mybalance[0,"food"] 。要查找 6 月的收入,應(yīng)查看 mybalance[6,"inco"] 。
balance,第 2 部分
function doincome(mybalance) { mybalance[curmonth,$3]= amount mybalance[0,$3]= amount}function doexpense(mybalance) { mybalance[curmonth,$2] -= amount mybalance[0,$2] -= amount}function dotransfer(mybalance) { mybalance[0,$2] -= amount mybalance[curmonth,$2] -= amount mybalance[0,$3]= amount mybalance[curmonth,$3]= amount}
調(diào)用 doincome() 或任何其它函數(shù)時,我們將交易記錄到兩個位置 -- mybalance[0,category] 和 mybalance[curmonth, category],它們分別表示全年的分類帳余額和當(dāng)月的分類帳余額 。這讓我們稍后可以輕松地生成年度或月度收入/支出明細(xì)分類帳 。
如果研究這些函數(shù),將發(fā)現(xiàn)在我的引用中傳遞了 mybalance 引用的數(shù)組 。另外,我們還引用了幾個全局變量:curmonth,它保存了當(dāng)前記錄所屬的月份的數(shù)值,$2(費(fèi)用分類帳),$3(收入分類帳)和金額($7,美元金額) 。調(diào)用 doincome() 和其它函數(shù)時,已經(jīng)為要處理的當(dāng)前記錄(行)正確設(shè)置了所有這些變量 。
主塊
以下是主代碼塊,它包含了分析每一行輸入數(shù)據(jù)的代碼 。請記住,由于正確設(shè)置了 FS,可以用 $ 1 引用第一個字段,用 $2 引用第二個字段,依次類推 。調(diào)用 doincome() 和其它函數(shù)時,這些函數(shù)可以從函數(shù)內(nèi)部訪問 curmonth、$2、$3 和金額的當(dāng)前值 。請先研究代碼,在代碼之后可以見到我的說明 。
balance,第 3 部分
{ curmonth=monthdigit(substr($1,4,3)) amount=$7 #record all the categories encountered if ( $2 != "-" ) globcat[$2]="yes" if ( $3 != "-" ) globcat[$3]="yes" #tally up the transaction properly if ( $2 == "-" ) { if ( $3 == "-" ) { print "Error: inc and exp fields are both blank!" exit 1 } else { #this is income doincome(balance) if ( $5 == "Y" ) doincome(balance2) } } else if ( $3 == "-" ) { #this is an expense doexpense(balance) if ( $5 == "Y" ) doexpense(balance2) } else { #this is a transfer dotransfer(balance) if ( $5 == "Y" ) dotransfer(balance2) } }
在主塊中,前兩行將 curmonth 設(shè)置成 1 到 12 之間的整數(shù),并將金額設(shè)置成字段 7(使代碼易于理解) 。然后,是四行有趣的代碼,它們將值寫到數(shù)組 globcat 中 。globcat,或稱作全局分類帳數(shù)組,用于記錄在文件中遇到的所有分類帳 -- "inco"、"misc"、"food"、"util" 等 。例如,如果 $2 == "inco",則將 globcat["inco"] 設(shè)置成 "yes" 。稍后,我們可以使用簡單的 "for (x in globcat)" 循環(huán)來迭代分類帳列表 。
在接著的大約二十行中,我們分析字段 $2 和 $3,并適當(dāng)記錄交易 。如果 $2=="-" 且 $3!="-",表示我們有收入,因此調(diào)用 doincome() 。如果是相反的情況,則調(diào)用 doexpense();如果 $2 和 $3 都包含分類帳,則調(diào)用 dotransfer() 。每次我們都將 "balance" 數(shù)組傳遞給這些函數(shù),從而在這些函數(shù)中記錄適當(dāng)?shù)臄?shù)據(jù) 。
您還會發(fā)現(xiàn)幾行代碼說“if ( $5 == "Y" ),那么將同一個交易記錄到 balance2 中” 。我們在這里究竟做了些什么?您將回憶起 $5 包含 "Y" 或 "N",并記錄交易是否已經(jīng)過帳到帳戶 。由于僅當(dāng)過帳了交易時我們才將交易記錄到 balance2,因此 balance2 包含了真實(shí)的帳戶余額,而 "balance" 包含了所有交易,不管是否已經(jīng)過帳 。可以使用 balance2 來驗(yàn)證數(shù)據(jù)項(xiàng)(因?yàn)樗鼞?yīng)該與當(dāng)前銀行帳戶余額匹配),可以使用 "balance" 來確保沒有透支帳戶(因?yàn)樗鼤紤]您開出的尚未兌現(xiàn)的所有支票) 。
生成報表
主塊重復(fù)處理了每一行記錄之后,現(xiàn)在我們有了關(guān)于比較全面的、按分類帳和按月份劃分的借方和貸方記錄 ?,F(xiàn)在,在這種情況下最合適的做法是只須定義生成報表的 END 塊:

推薦閱讀