1 awk的調(diào)用可以定義變量,提供程序并且指定輸入文件。 2 Awk [ -F fs ]
[ -v var=value …] ‘program’ [ --- ]\ [ var=value …
] [ file(s) ] Awk [ -F fs ] [ -v
var=value …] –f programfile [ --- ]\ [ var=value …
] [ file(s) ] A. 短程序直接在命令行上提供,長(zhǎng)的程序以-f項(xiàng)指定。 B. --是特殊選項(xiàng),指出awk本身已沒有進(jìn)一步的命令選項(xiàng),任何接下來的選項(xiàng)都被你的程序使用。 C. -F 用來重新定義默認(rèn)字段的分隔字符。分隔字符也可以使用內(nèi)建變量FS指定。 awk –F ‘\t’
‘{…}’ files FS=”[\f\v]” files D. –v選項(xiàng)必須放在命令行上直接給定的任何程序之前,它們會(huì)在程序啟動(dòng)之前以及處理文件之前生效。 3 awk程序模型。 A. awk把輸入流看作一連串的記錄的集合,一行一條記錄,每條記錄再分為字段。 B.一個(gè)awk程序是一對(duì)以模式與大括號(hào)框起來的操作組合而成的。模式與操作可省略其中一個(gè),如模式省略,則操作將被應(yīng)用到每條輸入記錄。如果操作省略,則默認(rèn)操作是打印匹配記錄到標(biāo)準(zhǔn)輸出上。 Pattern { action } Pattern { action } C. BEGIN
與END ,BEGIN模式對(duì)應(yīng)的操作只在-v選項(xiàng)完成后執(zhí)行一次,通常BEGIN放到各種操作之前,END模式對(duì)應(yīng)的操作在所有數(shù)據(jù)已被處理完成后執(zhí)行,只執(zhí)行一次,END通常放到最后。 4 程序元素 (1)
兩個(gè)連續(xù)的字符串會(huì)自動(dòng)連接到一起。 (2)
將數(shù)字轉(zhuǎn)換為字符串,通過數(shù)字連接空字符串便可:n=123, s = “” n (3)
awk 功能強(qiáng)大的地方來自于它對(duì)正則表達(dá)式的支持。~ 匹配,!~ 不匹配。 “ABC” ~ “^[A-Z]+$” 結(jié)果為真。 (4)正則表達(dá)式常量可以用引號(hào)或斜杠來定界。注意轉(zhuǎn)義:”\\\\Tex” 與/\Tex/
都匹配包含\Tex的字字符串表達(dá)式。 (5)
字符串轉(zhuǎn)換成數(shù)字。加個(gè)零到字符串就可,s = “ “+123ABC”轉(zhuǎn)成123,
“ABC (6) 5 內(nèi)建變量 FILENAME當(dāng)前的輸入文件名 FNR 當(dāng)前的輸入文件記錄數(shù)。 FS 字段分隔字符 NF當(dāng)前記錄的字段數(shù) NR在工作中的記錄數(shù) OFS輸出字段分隔字符 ORS輸出記錄分隔字符 RS 輸入記錄分隔字符(僅用gawk, mawk) 6 字段 字段可以以特殊名稱$0, $1, $2, … $NF供awk程序使用。$0引用當(dāng)前的記錄。記錄分隔符不是記錄的一部分。 7 awk里的單行程序。 (1) awk '{ C += length($0) + 1 ; W+= NF} {print NR, W, C }' 統(tǒng)計(jì)記錄數(shù)輸入的行數(shù)與總工的字節(jié)數(shù)。 (2) awk '{print $2, log($2) }' test2.txt 打印第2欄的值與其對(duì)數(shù)值。 (3) awk -v COLUMN=2 ' { sum += $COLUMN } {print sum} ' test2.txt報(bào)告第2欄的值,注意欄就是列的意思。 (4) awk '/main/ { print FILENAME ":" FNR ":" $0}' * 用AWK查找字符。然后打印出文件名所在和行與當(dāng)前記錄,也就是當(dāng)前行內(nèi)容。 (5) awk 'BEGIN { FS = "#"; OFS = "&" } { $2 = $2 ;print }' test3.txt > test4.txt 開始時(shí)指定#為記錄中的字段分隔符,指定&為輸出記錄的字段分隔符。 8 語句 (1)連續(xù)執(zhí)行。 多條語句寫在一行上用分號(hào)隔開,或是一個(gè)語句一行。 (2)條件執(zhí)行。 if( expressino) Statement else Sssss
(3) 重復(fù)執(zhí)行。 A, while(express) statement B, do statemetnt while(expresss) C, for(exp1;
exp2; exp3) statement D, for(
key in arrary) statement 用來反復(fù)處理數(shù)組里的元素。 可以使用break,
continue. 9 數(shù)組成員。 引用元素時(shí)如果元素不存在則會(huì)建一個(gè)元素。測(cè)試是應(yīng)這樣寫if( “sally” in telArry)而非if( telArry[“sally”]
!= “”); 10 用戶控制輸入 getline 11 執(zhí)行外部程序 有三種方式 (1)
getline語句通過管道外部程序通信。使用完管道后要用close()關(guān)閉。 (2)
輸出重定向與外部程序通訊。使用完文件后要用close()關(guān)閉。 (3)
system(command)。這個(gè)在system返回前會(huì)自動(dòng)關(guān)閉所用的文件或管道。 12 用戶定義函數(shù)。 (1)函數(shù)可以定義在程序頂層的任何位置:成對(duì)的模式/操作之前,之間,之后。慣例是放在后面。 (2)調(diào)用時(shí)函數(shù)名與括號(hào)之間不能有空格。 (3)標(biāo)量為傳值,數(shù)組為傳引用,函數(shù)里可以更改數(shù)組中的值。 (4)函數(shù)返回值不是零就是空字符串。 (5)所有用在函數(shù)體內(nèi)而在參數(shù)中沒有出現(xiàn)的變量都認(rèn)為是全局的。調(diào)用時(shí)傳入的參數(shù)可以比定義的少,多余的參數(shù)視為局部變量。 13 字符串函數(shù) (1) 子字符串提取 substr(string, start, len ) 返回一個(gè)由string的start字符開始,共len個(gè)字符長(zhǎng)度的子字符串副本。字符位置從1開始編號(hào), 參數(shù)超出范圍得到一個(gè)空串。 (2) 字符串長(zhǎng)度 length( string ) (3) 字母大小寫轉(zhuǎn)換 tolower(string), toupper( string ) tolower(“aBcDeF (4) 字符串查找。 index( string, find ), 在string里查找find, 然后返回string里find字符串的起始位置,如果找不到就返回0,注意字符位置從1開始。 index( tolower(string), tolower(find))可以在查找時(shí)忽略大小寫。 index只會(huì)找出第一個(gè)出現(xiàn)的字符串,要找最后一個(gè)的話沒有標(biāo)準(zhǔn)的函數(shù),下面這段程序可以完成這個(gè)功能。 function rindex( string, find, k, ns, nf ) { ns = length(string) nf = length(find) for( k = ns + 1-nf; k>=1; k--) if( substr(string, k, nf) == find) return k return 0 }
(5) 字符串匹配 match(string, regexp)將string與正則表達(dá)式regexp匹配,如果匹配就返回匹配string的索引,不匹配就返回0. (6) 字符串替換 sub( regexp, replacement, target) gsub(regexp, replacement, target) (7) 字符串分割。 A awk 對(duì)當(dāng)前記錄$0自動(dòng)進(jìn)行了分割,$1, $2,$3 $NF. B 可以用函數(shù)來做上面的分割。split( string, array, regexp ) regexp將string切割為片段,并存在array里,如果將第三個(gè)參數(shù)省略則用FS當(dāng)成分隔符。數(shù)組從1開始。 A split( $0, parts, “:”)以冒號(hào)分隔。 B split(string, chars, “”)分隔符沒有空格,就是把string分隔成單字節(jié)存放在chars數(shù)組中。 C split(“”, array ) 刪除array里的所有元素。 (8) 字符串重建 awk沒有提供標(biāo)準(zhǔn)的重建函數(shù),但可以通過下面的程序?qū)崿F(xiàn)。 function join(array, n, fs, k, s ) { #重新組合arrary元素為一字符串 #以fs為分隔 if( n >= 1 ) { s = array[1] for( k = 2; k<=n; k++) s = s fs array[k] } return (s) } 14 數(shù)值函數(shù) |
|