青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

All about Awk[譯]

All about Awk

All about Awk

1 說明

模式: pattern

動作: action

原文在這里

3 行間距

3.1 行間距加倍

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

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

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

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

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

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

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

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

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

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

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

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

3.4 使行間距增加兩倍.

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

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

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

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

4 計數(shù)和計算

4.1 單獨為每個文件的行計數(shù).

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

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

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

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

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

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

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

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

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

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

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

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

awk 'END { print NR }' filname.ext

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

4.6 輸出每行中各個字段的和.

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

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

4.7 輸出所有行中各個字段的和.

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

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

4.8 將每個字段替換為它的絕對值.

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

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

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

5 特定行的刪除/輸出

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

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

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

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

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

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

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

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

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

5.4 輸出每行的最后一個字段.

awk '{ print $NF }' filname.ext

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

5.5 輸出最后一行的最后一個字段.

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

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

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

awk 'NF > 4' filname.ext

這個單行程序省略了action語句. 就像我在3.1中提到的, 省略的action語句等價于'{print}'.

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

awk '$NF > 4' filname.ext

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

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

posted on 2008-12-10 11:11 季陽 閱讀(1349) 評論(0)  編輯 收藏 引用


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


<2008年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

導(dǎo)航

統(tǒng)計

常用鏈接

留言簿(2)

隨筆檔案(12)

搜索

最新隨筆

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲乱码国产乱码精品精天堂| 久久国产直播| 最新成人av在线| 免播放器亚洲一区| 亚洲高清久久网| 欧美激情1区2区3区| 欧美电影美腿模特1979在线看| 亚洲精品视频一区二区三区| 亚洲国产免费| 国产精品日本精品| 久久精品久久99精品久久| 久久精品国产亚洲5555| 亚洲福利在线视频| 亚洲精品视频免费| 国产精品视频网站| 免费视频一区| 欧美日韩国产麻豆| 久久福利一区| 欧美11—12娇小xxxx| 亚洲午夜精品久久| 欧美在线电影| 日韩一区二区精品在线观看| 亚洲在线国产日韩欧美| 在线欧美一区| 亚洲天堂黄色| 亚洲国产精品一区制服丝袜 | 亚洲免费高清视频| 亚洲免费影视第一页| 亚洲欧美日韩网| 国产精品久久久久久五月尺| 亚洲欧美日韩爽爽影院| 久久久国产精品一区二区中文| 亚洲人成网站777色婷婷| 亚洲一区二区三区欧美| 亚洲高清影视| 亚洲欧美国产精品va在线观看| 在线不卡a资源高清| 这里只有精品视频| 亚洲国产精品美女| 亚洲欧美国产不卡| 这里只有精品视频在线| 久久精品国产久精国产一老狼| 中文无字幕一区二区三区| 久久狠狠婷婷| 欧美亚洲综合久久| 欧美久久久久久久久久| 欧美不卡一卡二卡免费版| 国产伦精品一区二区| 最新国产の精品合集bt伙计| 一区二区三区在线看| 亚洲欧美国产精品va在线观看| 一区二区三区高清在线| 欧美a一区二区| 美女诱惑一区| 韩国视频理论视频久久| 亚洲免费一在线| 午夜视频久久久久久| 欧美日韩国产成人在线免费| 欧美国产激情二区三区| 精品69视频一区二区三区| 欧美一级视频| 午夜视频在线观看一区二区| 欧美午夜精品久久久久久久| 亚洲黄一区二区三区| 亚洲成色999久久网站| 久久精品在线| 免费日韩视频| 亚洲国产日韩欧美在线99| 久久美女性网| 欧美1区2区视频| 亚洲日本中文字幕| 欧美福利电影网| 亚洲精品偷拍| 亚洲午夜免费视频| 国产精品白丝jk黑袜喷水| 亚洲午夜国产成人av电影男同| 新片速递亚洲合集欧美合集| 国产精品一卡二| 久久久www成人免费无遮挡大片| 久久久在线视频| 在线观看三级视频欧美| 免费av成人在线| 亚洲美女精品久久| 欧美亚洲综合久久| 狠狠色丁香婷婷综合影院| 久久午夜影视| 亚洲精品免费观看| 午夜精品久久久久久久99热浪潮| 国产欧美精品一区aⅴ影院| 欧美一区二区性| 亚洲国产精品成人| 亚洲一区二区毛片| 国产又爽又黄的激情精品视频| 久久亚洲春色中文字幕| 亚洲精品一线二线三线无人区| 亚洲欧洲99久久| 久久久久久久久久久久久久一区| 亚洲日本久久| 欧美日韩视频一区二区三区| 亚洲欧美在线x视频| 欧美jizz19hd性欧美| 一本色道久久88精品综合| 国产精品视频大全| 美女主播视频一区| 亚洲一区免费| 欧美国产日韩亚洲一区| 亚洲欧美大片| 1024欧美极品| 国产精品你懂的在线| 可以免费看不卡的av网站| 亚洲深夜福利网站| 欧美大片网址| 久久精品国产一区二区三区| 亚洲精品极品| 影音先锋欧美精品| 国产精品久久久久久久久久尿 | 亚洲欧美日韩精品一区二区| 欧美护士18xxxxhd| 午夜精品久久久久久久久久久久久 | 亚洲一区二区黄色| 亚洲激情啪啪| 国产一区二区视频在线观看| 国产精品成av人在线视午夜片| 久久在线免费观看| 午夜亚洲伦理| 亚洲一区二区三区久久| 亚洲国产mv| 久久午夜视频| 久久精品1区| 欧美在线观看你懂的| 中文精品99久久国产香蕉| 亚洲精品美女久久7777777| 国语自产精品视频在线看一大j8| 国产精品国色综合久久| 欧美日韩亚洲另类| 欧美黄色精品| 欧美 日韩 国产在线| 久久先锋影音av| 久久综合九色综合网站| 久久精品国产91精品亚洲| 亚洲欧美国产视频| 亚洲欧美日本日韩| 亚洲欧美日韩在线| 亚洲欧美中文日韩在线| 亚洲综合色网站| 亚洲一区bb| 亚洲欧美视频一区| 亚洲欧美日韩另类| 午夜精品短视频| 性欧美大战久久久久久久久| 午夜亚洲影视| 久久精品亚洲一区二区| 久久亚洲美女| 欧美成人午夜激情视频| 欧美—级a级欧美特级ar全黄| 欧美日本一道本在线视频| 欧美日韩18| 国产精品视频久久| 国产一区二区三区在线观看网站| 黄色成人av| 亚洲乱码国产乱码精品精98午夜 | 国产精品久久久久久久久免费樱桃 | 亚洲国产精彩中文乱码av在线播放| 欧美国产亚洲另类动漫| 亚洲欧洲精品成人久久奇米网| 亚洲精品国产无天堂网2021| 亚洲视频成人| 久久成人精品一区二区三区| 久热精品在线视频| 欧美日韩一区不卡| 国产毛片一区| 亚洲人成精品久久久久| 亚洲综合日韩| 麻豆av一区二区三区久久| 亚洲青色在线| 欧美一级成年大片在线观看| 可以看av的网站久久看| 国产精品成人免费视频| 尤物精品在线| 中文精品在线| 免费人成网站在线观看欧美高清| 亚洲精品永久免费| 久久精品国产第一区二区三区| 欧美欧美天天天天操| 国产在线播精品第三| 在线视频中文亚洲| 久热精品视频在线| 一区二区三区四区五区在线| 久久天天躁狠狠躁夜夜爽蜜月| 欧美三日本三级少妇三2023 | 欧美另类69精品久久久久9999| 国产情侣一区| 亚洲视频免费在线观看| 久久裸体艺术| 亚洲与欧洲av电影| 欧美极品aⅴ影院| 在线观看欧美视频| 久久久久九九九| 亚洲欧美另类久久久精品2019| 欧美电影在线播放|