• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            All about Awk[譯]

            All about Awk

            All about Awk

            1 說(shuō)明

            模式: pattern

            動(dòng)作: action

            原文在這里

            3 行間距

            3.1 行間距加倍

            awk '1; { print "" }' filname.ext

            它是如何工作的呢? 這一行就是一個(gè)awk程序, 每個(gè)awk程序都包含一系列的pattern-action語(yǔ)句"pattern {action statements}". 在這個(gè)例子中, 一共有兩個(gè)語(yǔ)句:"1"和"{print ""}". 在pattern-action語(yǔ)句中, 模式或者動(dòng)作都可以省略掉. 如果省略模式, 動(dòng)作會(huì)應(yīng)用于輸入中的每一行. 而省略掉的動(dòng)作等價(jià)于'{print }'. 因此, 這行程序可以轉(zhuǎn)換為:

            awk '1 { print } { print "" }' filname.ext

            動(dòng)作只會(huì)應(yīng)用于匹配模式的行, 也就是說(shuō), 模式為真(true). 由于'1'永遠(yuǎn)為真, 因此這行程序可以進(jìn)一步轉(zhuǎn)換為兩個(gè)print語(yǔ)句:

            awk '{ print } { print "" }' filname.ext

            Awk中的每個(gè)print語(yǔ)句都會(huì)跟一個(gè)ORS-輸出記錄分隔符(Out Record Separator)變量, 默認(rèn)情況下是一個(gè)換行符. 第一個(gè)不帶參數(shù)的print語(yǔ)句等價(jià)與"print $0", 這里$0表示輸入的整行內(nèi)容.第二個(gè)print語(yǔ)句什么都不輸出, 但是由于每個(gè)后面都有一個(gè)ORS, 因此它實(shí)際輸出一個(gè)換行. 好了, 現(xiàn)在每一行都變成雙倍間距了.

            3.2 另一種行間距加倍的方式

            awk 'BEGIN { ORS="\n\n" }; 1' filname.ext

            BEGIN是一個(gè)特殊的模式, 它不是用來(lái)匹配輸入. 而是在任何輸入被讀入之前執(zhí)行. 這行程序通過(guò)將ORS設(shè)定為兩個(gè)換行來(lái)使文件間隔加倍. 就像我在前面提到過(guò)的, 語(yǔ)句"1"會(huì)被轉(zhuǎn)換為"{print}", 并且每個(gè)print語(yǔ)句都會(huì)以O(shè)RS變量作為結(jié)尾.

            3.3 使文件行間距加倍, 并且兩行文本之間不會(huì)有多于一行的空行.

            awk 'NF { print $0 "\n" }' filname.ext

            這個(gè)單行程序使用另一個(gè)特殊的變量:NF-Number of Fields. 它保存當(dāng)前行被分割后的字段數(shù). 例如, "this is a test"被分割為4部分, 因此NF的值為4. 空行""不能被分割為任何片段, 這時(shí)NF的值為0. 使用NF作為模式可以有效的過(guò)濾空行. 這個(gè)單行程序的意思是:如果包含任意數(shù)目的字段, 則將整行內(nèi)容輸出, 然后再輸出一個(gè)換行.

            3.4 使行間距增加兩倍.

            awk '1; { print "\n" }' filname.ext

            這個(gè)單行程序跟上一個(gè)很類似. '1'被轉(zhuǎn)換為'{ print }', 轉(zhuǎn)換后的結(jié)果為:

            awk '{ print; print "\n" }' filname.ext

            它輸出一行的內(nèi)容, 然后輸出一個(gè)換行, 后面再跟一個(gè)ORS, 默認(rèn)情況下ORS也是一個(gè)換行.

            4 計(jì)數(shù)和計(jì)算

            4.1 單獨(dú)為每個(gè)文件的行計(jì)數(shù).

            awk '{ print FNR "\t" $0 }' filname.ext

            這個(gè)Awk程序在每行前面添加FNR–File Line Number–和一個(gè)tab(\t).FNR變量單獨(dú)保存每個(gè)文件的當(dāng)前行行號(hào). 例如, 如果用這個(gè)單行程序處理兩個(gè)文件,其中一個(gè)有10行,另一個(gè)12行, 那么它會(huì)從1到10 給第一個(gè)文件的各行編號(hào), 然后重新從1開(kāi)始, 將第二個(gè)文件的各行依次編號(hào)為1到12. 也就是說(shuō)在處理兩個(gè)文件中間, FNR會(huì)被重置.

            4.2 給所有文件的行計(jì)數(shù).

            awk '{ print NR "\t" $0 }' filname.ext

            這個(gè)程序跟上一個(gè)的唯一不同在于:這兒用的是NR(Line Number)變量, 它在文件之間不會(huì)被重置. 它會(huì)為輸入的所有行計(jì)數(shù). 例如, 如果用這個(gè)程序來(lái)處理上個(gè)例子中的兩個(gè)文件, 它會(huì)將文件中的行依次編號(hào)為1到22(10+12).

            4.3 用精心設(shè)計(jì)的方式計(jì)數(shù).

            awk '{ printf("%5d : %s\n", NR, $0) }' filname.ext

            這個(gè)單行程序使用printf()函數(shù)來(lái)以定制的格式計(jì)數(shù). 它就像我們常見(jiàn)的printf()函數(shù)一樣帶有格式參數(shù). 注意printf()輸出的時(shí)候并不會(huì)附加ORS, 因此我們必須顯式地輸出換行符(\n). 這個(gè)程序以右對(duì)齊的方式輸出行號(hào), 后面跟一個(gè)空格和分號(hào), 然后是輸入行.

            4.4 只對(duì)文件中的非空行計(jì)數(shù).

            awk 'NF { $0=++a " :" $0 }; { print }' filname.ext

            Awk變量是動(dòng)態(tài)的, 它們產(chǎn)生于第一次被使用的時(shí)候. 這個(gè)單行程序中, 當(dāng)輸入行非空的時(shí)候, 先將a加1, 然后將a的值添加到當(dāng)前行的前面一起輸出.

            4.5 計(jì)算文件行數(shù)(模擬wc -l)

            awk 'END { print NR }' filname.ext

            END是另一個(gè)不會(huì)匹配輸入行的模式. 它在所有輸入都處理完之后執(zhí)行. 這個(gè)單行程序在處理完所有輸入之后輸出NR的值. NR中保存處理的總行數(shù).

            4.6 輸出每行中各個(gè)字段的和.

            awk '{ s = 0; for (i = 1; i <= NF; i++) s = s+$i; print s }' filname.ext

            Awk有一些C語(yǔ)言的特征, 例如for(;;) {…}循環(huán). 這個(gè)單行程序循環(huán)處理輸入行的各個(gè)字段(一行中有NF個(gè)字段), 將各個(gè)字段的值加到變量's'. 然后將累計(jì)值s輸出, 接著再處理下一行.

            4.7 輸出所有行中各個(gè)字段的和.

            awk '{ for (i = 1; i <= NF; i++) s = s+$i }; END { print s }' filname.ext

            這個(gè)程序跟4.6中的差不多, 區(qū)別在于它輸出所有字段的和. 要注意它是怎樣沒(méi)有將變量's'初始化為0. 由于變量是動(dòng)態(tài)產(chǎn)生的, 因此不需要初始化.

            4.8 將每個(gè)字段替換為它的絕對(duì)值.

            awk '{ for (i = 1; i &lt;= NF; i++) if ($i &lt; 0) $i = -$i; print }' filname.ext

            這個(gè)單行程序使用了兩個(gè)其他的C語(yǔ)言特性, 也就是if(…){…}語(yǔ)句和省略花括號(hào). 它循環(huán)處理一行輸入的所有字段, 檢查是否有字段的值小于0. 如果有字段的值小于0, 就對(duì)其取反, 是字段值變?yōu)檎龜?shù). 字段可以通過(guò)一個(gè)變量間接的訪問(wèn). 例如, i=5; $i='hello', 將第五個(gè)字段的值置為'hello'.下面是重寫(xiě)過(guò)的程序, 跟上面的相同, 不過(guò)為了清晰起見(jiàn)添加了花括號(hào). 在每行輸入的所有字段都被它們的絕對(duì)值替換之后, 'print'語(yǔ)句就會(huì)執(zhí)行.

            awk '{for (i = 1; i <= NF; i++) {if ($i < 0) {$i = -$i;}}print}' filname.ext

            4.9 記錄輸入文件中所有字段的數(shù)目.

            awk '{ total = total + NF }; END { print total }' filname.ext

            這個(gè)單行程序匹配所有的輸入行, 并且將每行中的字段數(shù)加起來(lái). 已處理過(guò)的輸入的字段數(shù)會(huì)保存在變量total中. 一旦輸入被處理完, 特殊的模式'END{…}'就會(huì)被執(zhí)行, 它會(huì)輸出總的字段數(shù).

            5 特定行的刪除/輸出

            5.1 輸出包含單詞"Beth"的行的總行數(shù).

            awk 'Beth { n++ }; END { print n+0 }' filname.ext

            這個(gè)單行程序有兩個(gè)pattern-action語(yǔ)句. 第一個(gè)是'Beth { n++ }'. 在兩個(gè)斜線之間的模式是一個(gè)正則表達(dá)式. 它匹配所有包含模式"Beth"的行(不一定非得是單詞"Beth", 也可以是"Bethe"或者"theBeth333"). 當(dāng)某行輸入匹配的時(shí)候,變量'n'增加1. 第二個(gè)pattern-action語(yǔ)句是'END {print n+0}'. 它在文件處理完之后執(zhí)行. 注意語(yǔ)句'print n+0'中的'+0'. 在沒(méi)有任何輸入行匹配的情況下, 它會(huì)強(qiáng)制輸出'0'(此時(shí)'n'是未定義的). 假設(shè)沒(méi)有'+0', 那就會(huì)輸出一個(gè)空行.

            5.2 查找第一個(gè)字段的值(數(shù)字)最大的行.

            awk '$1 > max { max=$1; maxline=$0 }; END { print max, maxline }' filname.ext

            這個(gè)單行程序始終保存輸入行中第一個(gè)字段的最大值(在變量max中)以及相應(yīng)的行(在變量maxline中). 一旦處理完所有的行, 就將最大值和對(duì)應(yīng)行輸出.

            5.3 輸出每行中的字段數(shù), 以及對(duì)應(yīng)的行.

            awk '{ print NF ":" $0 } ' filname.ext

            這個(gè)單行程序僅僅輸出預(yù)定義的變量NF-Number of Fields, 它保存輸入行中的字段數(shù), 然后輸出分號(hào)和當(dāng)前行.

            5.4 輸出每行的最后一個(gè)字段.

            awk '{ print $NF }' filname.ext

            Awk中的字段不一定非得通過(guò)常量引用. 例如, 類似'f=3; print $f'的代碼會(huì)輸出第三個(gè)字段. 這個(gè)單行程序輸出第NF個(gè)字段. $NF就是一行中的最后一個(gè)字段.

            5.5 輸出最后一行的最后一個(gè)字段.

            awk '{ field = $NF }; END { print field }' filname.ext

            這個(gè)單行程序始終將最后一個(gè)字段的值保存在變量'field'中. 一旦處理完所有的行, 變量field中保存的就是最后一行的最后一個(gè)字段, 然后會(huì)將它輸出.

            5.6 輸出字段數(shù)多于4的行.

            awk 'NF > 4' filname.ext

            這個(gè)單行程序省略了action語(yǔ)句. 就像我在3.1中提到的, 省略的action語(yǔ)句等價(jià)于'{print}'.

            5.7 輸出最后一個(gè)字段的值大于4的行.

            awk '$NF > 4' filname.ext

            這個(gè)單行程序跟5.4類似. 它通過(guò)NF引用最后一個(gè)字段. 如果它大于4, 則將它輸出.

            Date: 2008/12/10 11:09:39

            posted on 2008-12-10 11:11 季陽(yáng) 閱讀(1334) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            <2008年12月>
            30123456
            78910111213
            14151617181920
            21222324252627
            28293031123
            45678910

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(2)

            隨筆檔案(12)

            搜索

            最新隨筆

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            亚洲国产美女精品久久久久∴ | 日韩一区二区久久久久久| 亚洲国产日韩综合久久精品| 伊人久久亚洲综合影院| 久久午夜无码鲁丝片秋霞| 国产午夜免费高清久久影院| 久久国产乱子伦精品免费强| 国产精品一区二区久久精品无码 | 91精品国产91久久| 久久久久亚洲爆乳少妇无| 男女久久久国产一区二区三区| 久久福利青草精品资源站免费| 亚洲伊人久久成综合人影院| 无码AV中文字幕久久专区| 一本久道久久综合狠狠躁AV| 亚洲熟妇无码另类久久久| 久久www免费人成精品香蕉| 99久久综合国产精品免费| 中文字幕一区二区三区久久网站| 中文字幕无码免费久久| 91精品国产91热久久久久福利| 久久亚洲精品成人AV| 久久久国产精华液| 久久久久久久综合综合狠狠| 青草国产精品久久久久久| 色狠狠久久AV五月综合| 久久精品国产亚洲AV影院| 天天综合久久一二三区| 欧美一区二区精品久久| 国产精品禁18久久久夂久| 国产成人久久精品一区二区三区| 一级A毛片免费观看久久精品| 国产成人精品久久| 国产亚洲色婷婷久久99精品91| 欧美777精品久久久久网| 99精品国产在热久久无毒不卡| 99久久99久久久精品齐齐| 97热久久免费频精品99| 88久久精品无码一区二区毛片| 精品久久久无码中文字幕| 欧美久久一区二区三区|