溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Ubuntu Pattern正則表達(dá)式匹配所指定的示例分析

發(fā)布時間:2021-11-02 09:32:11 來源:億速云 閱讀:207 作者:柒染 欄目:系統(tǒng)運(yùn)維

本篇文章給大家分享的是有關(guān)Ubuntu Pattern正則表達(dá)式匹配所指定的示例分析,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

Ubuntu Pattern已被廣泛應(yīng)用但是也在不斷的更新,這里介紹Ubuntu Pattern安裝設(shè)置使用,幫助大家安裝更新Ubuntu Pattern系統(tǒng)。選擇符合指定條件的記錄 Ubuntu Pattern { Action }為awk中最主要的語法. 若某Ubuntu Pattern之值為真則執(zhí)行它后方的 Action. awk中常使用"關(guān)系表達(dá)式" (Relational Expression)來當(dāng)成 Ubuntu Pattern.

awk 中除了>, <, ==, != ,...等關(guān)系運(yùn)算符( Relational Operators )外,另外提供 ~(match),!~(Not Match) 二個關(guān)系運(yùn)算符. 利用這兩個運(yùn)算符, 可判斷某字符串是否包含能匹配所指定正則表達(dá)式的子字符串. 由于這些特性, 很容易使用awk來編寫需要字符串比對, 判斷的程序. 組裝部門員工調(diào)薪5%,(組裝部門員工之ID以"A"開頭) 所有員工***之薪資率若仍低于100, 則以100計(jì). 編寫awk程序打印新的員工薪資率報(bào)表.

[分析 ] : 這個程序須先判斷所讀入的數(shù)據(jù)行是否合于指定條件, 再進(jìn)行某些動作.awk中 Ubuntu Pattern { Actions } 的語法已涵蓋這種 " if ( 條件) { 動作} "的架構(gòu). 編寫如下之程序, 并取名 adjust1.awk $1 ~ /^A.*/ { $3 *= 1.05 } $3<100 { $3 = 100 } { printf("%s %8s %d"n", $1, $2, $3)} 執(zhí)行下列命令 : $awk -f adjust1.awk emp.dat

結(jié)果如下 : 屏幕出現(xiàn) :

A125    Jenny 105   A341      Dan 115   P158      Max 130   P148     John 125   A123    Linda 100

說 明 : awk的工作程序是: 從數(shù)據(jù)文件中每次讀入一個數(shù)據(jù)行, 依序執(zhí)行完程序中所有的 Ubuntu Pattern{ Action }指令:

$1~/^A.*/ { $3 *= 1.05 }   $3 < 100 { $3 = 100 }   {printf("%s %8s %d"n",$1,$2,$3)}

再從數(shù)據(jù)文件中讀進(jìn)下一筆記錄繼續(xù)進(jìn)行處理. ***個 Ubuntu Pattern { Action }是: $1 ~ /^A.*/ { $3 *= 1.05 } $1 ~ /^A.*/ 是一個Ubuntu Pattern, 用來判斷該筆數(shù)據(jù)行的***欄是否包含以"A"開頭的子字符串. 其中 /^A.*/ 是一個Regular Expression, 用以表示任何以"A"開頭的字符串. (有關(guān) Regular Expression 之用法 參考 附錄 E ).

Actions 部分為 $3 *= 1.05 $3 *= 1.05 與 $3 = $3 * 1.05 意義相同. 運(yùn)算子"*=" 之用法則與 C 語言中一樣. 此后與 C 語言中用法相同的運(yùn)算子或語法將不予贅述. 第二個 Ubuntu Pattern { Actions } 是: $3 <100 {$3 = 100 } 若第三欄的數(shù)據(jù)內(nèi)容(表薪資率)小于100, 則調(diào)整為100. 第三個 Ubuntu Pattern { Actions } 是: {printf("%s %8s %d"n",$1, $2, $3 )} 省略了Ubuntu Pattern(無條件執(zhí)行Actions), 故所有數(shù)據(jù)行調(diào)整后的數(shù)據(jù)都將被印出.

awk 中數(shù)組

awk程序中允許使用字符串當(dāng)做數(shù)組的下標(biāo)(index). 利用這個特色十分有助于資料統(tǒng)計(jì)工作.(使用字符串當(dāng)下標(biāo)的數(shù)組稱為Associative Array) 首先建立一個數(shù)據(jù)文件, 并取名為 reg.dat. 此為一學(xué)生注冊的資料文件; ***欄為學(xué)生姓名, 其后為該生所修課程.

Mary O.S. Arch. Discrete   Steve D.S. Algorithm Arch.   Wang Discrete Graphics O.S.   Lisa Graphics A.I.   Lily Discrete Algorithm

awk中數(shù)組的特性 使用字符串當(dāng)數(shù)組的下標(biāo)(index). 使用數(shù)組前不須宣告數(shù)組名及其大小. 例如: 希望用數(shù)組來記錄 reg.dat 中各門課程的修課人數(shù). 這情況,有二項(xiàng)信息必須儲存:
(a) 課程名稱, 如: "O.S.","Arch.".. ,共有哪些課程事先并不明確.
(b)各課程的修課人數(shù). 如: 有幾個人修"O.S."

在awk中只要用一個數(shù)組就可同時記錄上列信息. 其方法如下: 使用一個數(shù)組 Number[ ] : 以課程名稱當(dāng) Number[ ] 的下標(biāo). 以 Number[ ] 中不同下標(biāo)所對映的元素代表修課人數(shù).

例如: 有2個學(xué)生修 "O.S.", 則以 Number["O.S."] = 2 表之. 若修"O.S."的人數(shù)增加一人,則 Number["O.S."] = Number["O.S."] + 1 或 Number["O.S."]++ . 如何取出數(shù)組中儲存的信息 以 C 語言為例, 聲明 int Arr[100]; 之后, 若想得知 Arr[ ]中所儲存的數(shù)據(jù), 只須用一個循環(huán), 如 : for(i=0; i<100; i++) printf("%d"n", Arr[i]);

即可. 上式中: 數(shù)組 Arr[ ] 的下標(biāo) : 0, 1, 2,..., 99 數(shù)組 Arr[ ] 中各下標(biāo)所對應(yīng)的值 : Arr[0], Arr[1],...Arr[99] 但 awk 中使用數(shù)組并不須事先宣告. 以剛才使用的 Number[ ] 而言, 程序執(zhí)行前, 并不知將來有哪些課程名稱可能被當(dāng)成 Number[ ] 的下標(biāo).

awk 提供了一個指令, 藉由該指令awk會自動找尋數(shù)組中使用過的所有下標(biāo). 以 Number[ ] 為例, awk將會找到 "O.S.", "Arch.",... 使用該指令時, 須指定所要找尋的數(shù)組, 及一個變量. awk會使用該的變量來記錄從數(shù)組中找到的每一個下標(biāo). 例如

for(course in Number){....} 指定用 course 來記錄 awk 從Number[ ] 中所找到的下標(biāo). awk每找到一個下標(biāo)時, 就用course記錄該下標(biāo)之值且執(zhí)行{....}中之指令. 藉由這個方式便可取出數(shù)組中儲存的信息.

[ 范例 : ] 統(tǒng)計(jì)各科修課人數(shù),并印出結(jié)果. 建立如下程序,并取名為 course.awk: { for( i=2; i <= NF; i++) Number[$i]++ } END{for(course in Number) printf("%10s %d"n", course, Number[course] )}

執(zhí)行下列命令 : $awk -f course.awk reg.dat
執(zhí)行結(jié)果如下 :

Graphics 2   O.S. 2   Discrete 3   A.I. 1   D.S. 1   Arch. 2   Algorithm 2

這程序包含二個Ubuntu Pattern { Actions }指令. { for( i=2; i <= NF; i++) Number[$i]++ } END{for(course in Number) printf("%10s %d"n", course, Number[course] )} ***個Ubuntu Pattern { Actions }指令中省略了Ubuntu Pattern 部分. 故隨著每筆數(shù)據(jù)行的讀入其Actions部分將逐次無條件被執(zhí)行.

以awk讀入***筆資料 " Mary O.S. Arch. Discrete" 為例, 因?yàn)樵摴P數(shù)據(jù) NF = 4(有4個字段), 故該 Action 的for Loop中i = 2,3,4. i $i 最初 Number[$i] Number[$i]++ 之后 i=2時 $i="O.S." Number["O.S."]的值從默認(rèn)的0,變成了1 ;i=3時 $i="Arch." Number["Arch."]的值從默認(rèn)的0,變成了1 ;同理,i=4時 $i="Discrete" Number["Discrete"]的值從默認(rèn)的0,變成了1 ;

第二個 Ubuntu Pattern { Actions }指令中END 為awk之保留字, 為 Ubuntu Pattern 的一種. END 成立(其值為true)的條件是: "awk處理完所有數(shù)據(jù), 即將離開程序時. "平常讀入數(shù)據(jù)行時, END并不成立, 故其后的Actions 并不被執(zhí)行; 唯有當(dāng)awk讀完所有數(shù)據(jù)時, 該Actions才會被執(zhí)行 ( 注意, 不管數(shù)據(jù)行有多少筆, END僅在***才成立, 故該Actions僅被執(zhí)行一次.)

BEGIN 與 END 有點(diǎn)類似, 是awk中另一個保留的Ubuntu Pattern. 唯一不同的是: "以 BEGIN 為 Ubuntu Pattern 的 Actions 于程序一開始執(zhí)行時, 被執(zhí)行一次." NF 為awk的內(nèi)建變量, 用以表示awk正處理的數(shù)據(jù)行中, 所包含的字段個數(shù). awk程序中若含有以 $ 開頭的自定變量, 都將以如下方式解釋 : 以 i= 2 為例, $i = $2 表第二個字段數(shù)據(jù). ( 實(shí)際上, $ 在 awk 中為一運(yùn)算符(Operator), 用以取得字段數(shù)據(jù).)

以上就是Ubuntu Pattern正則表達(dá)式匹配所指定的示例分析,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI