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

通用線程:Awk 實例( 九 )


print mymonths[1],mymonths[numelements]
……將打?。?
Jan Dec
特殊字符串形式
簡短注釋 -- 調(diào)用 length()、sub() 或 gsub() 時,可以去掉最后一個自變量,這樣 awk 將對 $0(整個當前行)應用函數(shù)調(diào)用 。要打印文件中每一行的長度,使用以下 awk 腳本:
{ print length() }
財務上的趣事
幾星期前,我決定用 awk 編寫自己的支票簿結算程序 。我決定使用簡單的 tab 定界文本文件,以便于輸入最近的存款和提款記錄 。其思路是將這個數(shù)據(jù)交給 awk 腳本,該腳本會自動合計所有金額,并告訴我余額 。以下是我決定如何將所有交易記錄到 "ASCII checkbook" 中:
23 Aug 2000 food - - Y Jimmy"s Buffet 30.25
此文件中的每個字段都由一個或多個 tab 分隔 。在日期(字段 1,$1)之后,有兩個字段叫做“費用分類帳”和“收入分類帳” 。以上面這行為例,輸入費用時,我在費用字段中放入四個字母的別名,在收入字段中放入 "-"(空白項) 。這表示這一特定項是“食品費用” 。:) 以下是存款的示例:
23 Aug 2000 - inco - Y Boss Man 2001.00
在這個實例中,我在費用分類帳中放入 "-"(空白),在收入分類帳中放入 "inco" 。"inco" 是一般(薪水之類)收入的別名 。使用分類帳別名讓我可以按類別生成收入和費用的明細分類帳 。至于記錄的其余部分,其它所有字段都是不需加以說明的 ?!笆欠窀肚澹俊弊侄危?Y" 或 "N")記錄了交易是否已過帳到我的帳戶;除此之外,還有一個交易描述,和一個正的美元金額 。
用于計算當前余額的算法不太難 。awk 只需要依次讀取每一行 。如果列出了費用分類帳,但沒有收入分類帳(為 "-"),那么這一項就是借方 。如果列出了收入分類帳,但沒有費用分類帳(為 "-"),那么這一項就是貸方 。而且,如果同時列出了費用和收入分類帳,那么這個金額就是“分類帳轉(zhuǎn)帳”;即,從費用分類帳減去美元金額,并將此金額添加到收入分類帳 。此外,所有這些分類帳都是虛擬的,但對于跟蹤收入和支出以及預算卻非常有用 。
代碼
現(xiàn)在該研究代碼了 。我們將從第一行(BEGIN 塊和函數(shù)定義)開始:
balance,第 1 部分
#!/usr/bin/env awk -fBEGIN { FS="t " months="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec"}function monthdigit(mymonth) { return (index(months,mymonth) 3)/4}
首先執(zhí)行 "chmodx myscript" 命令,那么將第一行 "#!..." 添加到任何 awk 腳本將使它可以直接從 shell 中執(zhí)行 。其余行定義了 BEGIN 塊,在 awk 開始處理支票簿文件之前將執(zhí)行這個代碼塊 。我們將 FS(字段分隔符)設置成 "t ",它會告訴 awk 字段由一個或多個 tab 分隔 。另外,我們定義了字符串 months,下面將出現(xiàn)的 monthdigit() 函數(shù)將使用它 。
最后三行顯示了如何定義自己的 awk。格式很簡單 -- 輸入 "function",再輸入名稱,然后在括號中輸入由逗號分隔的參數(shù) 。在此之后,"{ }" 代碼塊包含了您希望這個函數(shù)執(zhí)行的代碼 。所有函數(shù)都可以訪問全局變量(如 months 變量) 。另外,awk 提供了 "return" 語句,它允許函數(shù)返回一個值,并執(zhí)行類似于 C 和其它語言中 "return" 的操作 。這個特定函數(shù)將以 3 個字母字符串格式表示的月份名稱轉(zhuǎn)換成等價的數(shù)值 。例如,以下代碼:
print monthdigit("Mar")
……將打?。?
3
現(xiàn)在,讓我們討論其它一些函數(shù) 。
財務函數(shù)
以下是其它三個執(zhí)行簿記的函數(shù) 。我們即將見到的主代碼塊將調(diào)用這些函數(shù)之一,按順序處理支票簿文件的每一行,從而將相應交易記錄到 awk 數(shù)組中 。有三種基本交易,貸方 (doincome)、借方 (doexpense) 和轉(zhuǎn)帳 (dotransfer) 。您會發(fā)現(xiàn)這三個函數(shù)全都接受一個自變量,叫作 mybalance 。mybalance 是二維數(shù)組的一個占位符,我們將它作為自變量進行傳遞 。目前,我們還沒有處理過二維數(shù)組;但是,在下面可以看到,語法非常簡單 。只須用逗號分隔每一維就行了 。

推薦閱讀