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

通用線程--sed 實(shí)例,第3部分( 二 )


過去幾個(gè)星期,我一直想買一份 Quicken 來結(jié)算我的銀行帳戶 。Quicken 是一個(gè)非常好的金融程序,當(dāng)然會(huì)成功地完成這項(xiàng)工作 。但是,經(jīng)過考慮之后,我覺得自己可以輕易編寫某個(gè)軟件來結(jié)算我的支票簿 。我想,畢竟,我是個(gè)軟件開發(fā)人員!我開發(fā)了一個(gè)很好的小型支票簿結(jié)算程序(使用 awk),它通過分析包含我的所有交易的文本文件的語(yǔ)法來計(jì)算余額 。略微調(diào)整之后,我將其改進(jìn),以便可以象 Quicken 那樣跟蹤不同的貸款和借款類別 。但是,我還要添加一個(gè)特性 。最近,我將帳戶轉(zhuǎn)移到一家有聯(lián)機(jī) Web 帳戶界面的銀行 。有一天,我注意到,這家銀行的 Web 站點(diǎn)允許以 Quicken 的 .QIF 格式下載我的帳戶信息 。我馬上覺得,如果可以將該信息轉(zhuǎn)換成文本格式,那就太棒了 。兩種格式的故事
在查看 QIF 格式之前,先看一下我的 checkbook.txt 格式:28 Aug 2000 food - - Y Supermarket 30.94 25 Aug 2000 watr - 103 Y Check 103 52.86

在我的文件中,所有字段都由一個(gè)或多個(gè)制表符分開,每個(gè)交易占據(jù)一行 。日期之后的下一個(gè)字段列出支出類型(如果是收入項(xiàng),則為 "-") 。第三個(gè)字段列出收入類型(如果是支出項(xiàng),則為 "-") 。然后,是一個(gè)支票號(hào)字段(如果為空,則還是 "-"),一個(gè)交易完成字段("Y" 或 "N"),一個(gè)注釋和一個(gè)美元金額字段 。現(xiàn)在,讓我們看一下 QIF 格式 。當(dāng)用文本查看器查看下載的 QIF 文件時(shí),它看起來如下:!Type:Bank D08/28/2000 T-8.15 N PCHECKCARD SUPERMARKET ^ D08/28/2000 T-8.25 N PCHECKCARD PUNJAB RESTAURANT ^ D08/28/2000 T-17.17 N PCHECKCARD SUPERMARKET

瀏覽過文件之后,不難猜出其格式 -- 忽略第一行,其余的格式如下:D<數(shù)據(jù)>
T<交易量>
N<支票號(hào)>
P<描述>
^ (這是字段分隔符)

開始處理
在處理象這樣重要的 sed 項(xiàng)目時(shí),不要?dú)怵H -- sed 允許您將數(shù)據(jù)逐漸修改成最終形式 。在進(jìn)行當(dāng)中,可以繼續(xù)細(xì)化 sed 腳本,直到輸出與預(yù)期的完全一樣為止 。無需在試第一次時(shí)就保證其完全正確 。要開始,首先創(chuàng)建一個(gè)名為 "qiftrans.sed" 的文件,然后開始修改數(shù)據(jù):1d /^^/d s/[[:cntrl:]]//g

第一個(gè) "1d" 命令刪除第一行,第二個(gè)命令從輸出除去那些討厭的 "^" 字符 。最后一行除去文件中可能存在的任何控制字符 。既然在處理外來文件格式,我想消除在中途遇到任何控制字符的風(fēng)險(xiǎn) 。到目前為止,一切順利 ?,F(xiàn)在,要向該基本腳本中添加一些處理功能:1d /^^/d s/[[:cntrl:]]//g /^D/ {
s/^D(.*)/1tOUTYtINNYt/
s/^01/Jan/ s/^02/Feb/
s/^03/Mar/ s/^04/Apr/
s/^05/May/ s/^06/Jun/
s/^07/Jul/ s/^08/Aug/
s/^09/Sep/ s/^10/Oct/
s/^11/Nov/ s/^12/Dec/
s:^(.*)/(.*)/(.*):2 1 3: }

首先,添加一個(gè) "/^D/" 地址,以便 sed 只在遇到 QIF 數(shù)據(jù)字段的第一個(gè)字符 "D" 時(shí)才開始處理 。當(dāng) sed 將這樣一行讀入其模式空間時(shí),將按順序執(zhí)行花括號(hào)中的所有命令 ?;ɡㄌ?hào)中的第一個(gè)命令將把如下行:D08/28/2000

變換成:08/28/2000OUTYINNY

當(dāng)然,現(xiàn)在的格式還不完美,但沒關(guān)系 。我們將在進(jìn)行過程中逐漸細(xì)化模式空間的內(nèi)容 。后面 12 行的最后效果是將數(shù)據(jù)變換成三個(gè)字母的格式,最后一行從數(shù)據(jù)中除去三個(gè)斜杠 。最后得到這一行:Aug 28 2000OUTYINNY

OUTY 和 INNY 字段是占位符,以后將被替換 ?,F(xiàn)在還不能確定它們,因?yàn)槿绻涝痤~為負(fù),將把 OUTY 和 INNY 設(shè)置成 "misc" 和 "-",但是,如果美元金額為正,將分別把它們更改成 "-" 和 "inco" 。既然還沒有讀入美元金額,所以,需要暫時(shí)使用占位符 。細(xì)化
現(xiàn)在進(jìn)一步細(xì)化:1d /^^/d s/[[:cntrl:]]//g /^D/ {
s/^D(.*)/1tOUTYtINNYt/
s/^01/Jan/ s/^02/Feb/
s/^03/Mar/ s/^04/Apr/
s/^05/May/ s/^06/Jun/

推薦閱讀