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

通用線程:Awk 實例( 三 )


{ if ( $1 == "foo" ) { if ( $2 == "foo" ) { print "uno" } else { print "one" } } else if ($1 == "bar" ) { print "two" } else { print "three" }}
使用 if 語句還可以將代碼:
! /matchme/ { print $1 $3 $4 }
轉(zhuǎn)換成:
{ if ( $0 !~ /matchme/ ) { print $1 $3 $4 }}
這兩個腳本都只輸出不包含 matchme 字符序列的那些行 。此外,還可以選擇最適合您的代碼的方法 。它們的功能完全相同 。
awk 還允許使用布爾運算符 "||"(邏輯與)和 "&&"(邏輯或),以便創(chuàng)建更復(fù)雜的布爾表達式:
( $1 == "foo" ) && ( $2 == "bar" ) { print }
這個示例只打印第一個字段等于 foo 且第二個字段等于 bar 的那些行 。
數(shù)值變量!
至今,我們不是打印字符串、整行就是特定字段 。然而,awk 還允許我們執(zhí)行整數(shù)和浮點運算 。通過使用數(shù)學(xué)表達式,可以很方便地編寫計算文件中空白行數(shù)量的腳本 。以下就是這樣一個腳本:
BEGIN { x=0 }/^$/ { x=x 1 }END { print "I found " x " blank lines. :)" }
在 BEGIN 塊中,將整數(shù)變量 x 初始化成零 。然后,awk 每次遇到空白行時,awk 將執(zhí)行 x=x 1 語句,遞增 x 。處理完所有行之后,執(zhí)行 END 塊,awk 將打印出最終摘要,指出它找到的空白行數(shù)量 。
字符串化變量
awk 的優(yōu)點之一就是“簡單和字符串化” 。我認為 awk 變量“字符串化”是因為所有 awk 變量在內(nèi)部都是按字符串形式存儲的 。同時,awk 變量是“簡單的”,因為可以對它執(zhí)行數(shù)學(xué)操作,且只要變量包含有效數(shù)字字符串,awk 會自動處理字符串到數(shù)字的轉(zhuǎn)換步驟 。要理解我的觀點,請研究以下這個示例:
x="1.01"# We just set x to contain the *string* "1.01"x=x 1# We just added one to a *string* print x# Incidentally, these are comments :)
awk 將輸出:
2.01
有趣吧!雖然將字符串值 1.01 賦值給變量 x,我們?nèi)匀豢梢詫λ右?。但在 bash 和 python 中卻不能這樣做 。首先,bash 不支持浮點運算 。而且,如果 bash 有“字符串化”變量,它們并不“簡單”;要執(zhí)行任何數(shù)學(xué)操作,bash 要求我們將數(shù)字放到丑陋的 $( ) ) 結(jié)構(gòu)中 。如果使用 python,則必須在對 1.01 字符串執(zhí)行任何數(shù)學(xué)運算之前,將它轉(zhuǎn)換成浮點值 。雖然這并不困難,但它仍是附加的步驟 。如果使用 awk,它是全自動的,而那會使我們的代碼又好又整潔 。如果想要對每個輸入行的第一個字段乘方并加一,可以使用以下腳本:
{ print ($1^2) 1 }
如果做一個小實驗,就可以發(fā)現(xiàn)如果某個特定變量不包含有效數(shù)字,awk 在對數(shù)學(xué)表達式求值時會將該變量當(dāng)作數(shù)字零處理 。
眾多運算符
awk 的另一個優(yōu)點是它有完整的數(shù)學(xué)運算符集合 。除了標(biāo)準(zhǔn)的加、減、乘、除,awk 還允許使用前面演示過的指數(shù)運算符 "^"、模(余數(shù))運算符 "%" 和其它許多從 C 語言中借入的易于使用的賦值操作符 。
這些運算符包括前后加減(i、--foo)、加/減/乘/除賦值運算符( a =3、b*=2、c/=2.2、d-=6.2) 。不僅如此 -- 我們還有易于使用的模/指數(shù)賦值運算符(a^=2、b%=4) 。
字段分隔符
awk 有它自己的特殊變量集合 。其中一些允許調(diào)整 awk 的運行方式,而其它變量可以被讀取以收集關(guān)于輸入的有用信息 。我們已經(jīng)接觸過這些特殊變量中的一個,F(xiàn)S 。前面已經(jīng)提到過,這個變量讓您可以設(shè)置 awk 要查找的字段之間的字符序列 。我們使用 /etc/passwd 作為輸入時,將 FS 設(shè)置成 ":" 。當(dāng)這樣做有問題時,我們還可以更靈活地使用 FS 。
FS 值并沒有被限制為單一字符;可以通過指定任意長度的字符模式,將它設(shè)置成規(guī)則表達式 。如果正在處理由一個或多個 tab 分隔的字段,您可能希望按以下方式設(shè)置 FS:
FS="t "
以上示例中,我們使用特殊 " " 規(guī)則表達式字符,它表示“一個或多個前一字符” 。

推薦閱讀