awk編程學(xué)習(xí)筆記基礎(chǔ)篇
-
awk編程的基本框架為:
BEGIN{} #循環(huán)前部命令
{} #循環(huán)中,對(duì)于每行進(jìn)行一次循環(huán),包括模式和過程兩個(gè)部分,如果匹配一次模式,則進(jìn)行一次循環(huán)
END{} #主循環(huán)結(jié)束后的命令
BEGIN模式用于在一個(gè)輸入行讀入之前要執(zhí)行的動(dòng)作
$awk 'BEGIN {print "Hello,World"}'
awk程序是由所謂的主輸入循環(huán)組成的,當(dāng)沒有其他行讀入時(shí)循環(huán)終止
awk后綴腳本在hadoop集群中 /home/shanjiajun/ 文件夾中
/[0-9] */ {print "that is an integer"} 模式(可以為正則表達(dá)式)+過程
注:連續(xù)的兩個(gè)或多個(gè)空格和/或制表符被作為一個(gè)分隔符
- FS為系統(tǒng)變量讀入指定域分隔符,OFS為系統(tǒng)變量寫出指定域分隔符,在BEGIN中指定
BEGIN {FS=",",OFS=","}
- awk 腳本的運(yùn)行方法:
腳本 : BEGIN {FS=","} {print $1","$6}
運(yùn)行 : awk -f phonelist.awk names
-
awk 編程中所有沒有賦值的變量初始狀態(tài)為0,多行打印用分號(hào)隔開
NF和NR也為系統(tǒng)變量,分別為字段的數(shù)量和行號(hào),則$NF為最后一個(gè)字段,$(NF-1)為倒數(shù)第二個(gè)字段
LENGTH為字符串的長度函數(shù)
邏輯運(yùn)算三種方式 : && || !
例如:
($5!~/MA/) && (NF==6) {print $0} #打印第五個(gè)字段不匹配MA字符且字段數(shù)為6的行
- print和printf的主要區(qū)別在于printf沒有提供自動(dòng)換行功能,需要加上一個(gè)\n
%s為字符型 %f為浮點(diǎn)型 %d為整型
一個(gè)printf語句表達(dá)式可以規(guī)定輸出欲的寬度和對(duì)齊方式,可以由3個(gè)可選的修飾符組成,跟在%后面
形式為:%-width.precision format-specifier
awk打印默認(rèn)為右對(duì)齊格式,-為設(shè)置為左對(duì)齊,width為設(shè)置的字符的寬度,precision為字符的精度,一般用在%f浮點(diǎn)型中
條件、循環(huán)、和數(shù)組
if(expression) action1
[else action2]
特別的例子
if(x~/[yY](es)?/) print x
循環(huán)
while (condition) action
do
action
while (condition)
#至少循環(huán)一次
for(i=1;i<=NF;i++) print $i
break 終止循環(huán)
continue 停止本次循環(huán),直接進(jìn)入下一次循環(huán)
數(shù)組
awk編程中數(shù)組下標(biāo)從1開始
所有數(shù)組都是關(guān)聯(lián)數(shù)組,下標(biāo)可以是一個(gè)字符串或者數(shù)組
- 有一個(gè)特殊的循環(huán)語法可以訪問關(guān)聯(lián)數(shù)組:
for(variable in array)
do something with array[variable]
分組運(yùn)算
cat * |awk -F':' '{a[$1":"$2]+=$6}END{for(i in a) print i":"a[i]}' #注意:BEGIN和END一定要大寫
函數(shù):
function name (x1,x2...){statments }