有awk入門教程嗎?
答:本文邀請(qǐng)kitman來回答,理論結(jié)合實(shí)際為你獻(xiàn)上奉上后臺(tái)必備技能-awk入門教程~
首先說明,awk的數(shù)值只有雙精度浮點(diǎn)型。awk是一種非常強(qiáng)大文本處理工具,可以相當(dāng)于一個(gè)數(shù)據(jù)庫(kù)來使用。
$digit 代表第幾個(gè)字段,字段之間的間隔默認(rèn)是空格或者\(yùn)t,多個(gè)連續(xù)的間隔算一個(gè)間隔,$0代表這一行
awk命令的基本格式awk 'awk程序語句' 輸入文件1 輸入文件2 …
awk 程序語句的基本格式pattern1 {action1} pattern2 {action2} …
pattern是篩選的條件,支持||、&&、! 這些條件組合
注:pattern可為空,即每一行,pattern還支持正則表達(dá)式,/正則內(nèi)容/ {action}
eg:
awk '$6 != 0{print $0}' file1
即這一行的第六個(gè)字段不等于0,則打印這一行
awk的內(nèi)置變量NR 記錄當(dāng)前已經(jīng)讀取的行數(shù)(不是輸出的行數(shù))
FNR 作用域是當(dāng)前文件的NR
NF 記錄當(dāng)前行的字段數(shù)
trick:當(dāng)多個(gè)輸入文件時(shí),NR==FNR 即這一行在第一個(gè)文件中,NR>FNR即這一行不在第一個(gè)文件中。
awk的內(nèi)置特殊patternBEGIN:匹配第一個(gè)輸入文件第一行之前的位置
END:最后一個(gè)輸入文件最后一行之后的位置
awk的actionaction里面可以定運(yùn)算,支持+ - × / % 五種運(yùn)算。變量直接只用,不需要聲明;
action中如果有多條語句,那么可以用;隔開
awk中只有兩種類型:數(shù)值、字符串。可以變量可以使用字符串的拼接,使用空格隔開。
eg:
test.awk:
1 2 3 4
2 3 18 2
a b 17 1
awk '$3 > 15 {count=count+1} END {print count}' test.awk
2
awk '$3 > 15 {count=count+1;var=count "haha";print var}' test.awk
1haha
2haha
awk '$3 > 15 {count=count+1;var=count "_haha";print var}' test.awk
1_haha
2_haha
即計(jì)算第三個(gè)字段大于15的行數(shù),最后打印出來
awk的數(shù)組與控制語句awk支持?jǐn)?shù)組,和使用一般的變量一樣,不需要聲明,直接a[下標(biāo)]=value就可以了。這個(gè)下標(biāo)可以是字符。
awk還支持一般編程語言中常見的控制結(jié)構(gòu)if、while、for,和c中的寫法一樣。
if(){}else{}
while(){}
for( ; ;){}
eg:
逆序打印行,這里使用了printf,它的用法和c中的printf差不多,可以用于格式化的輸出,默認(rèn)不輸出換行。
awk'{line[NR]=$0} END{i=NR;while(i>0) {printf line[i]"\n";i=i-1}}' test.awk
a b 17 1
2 3 18 2
1 2 3 4
awk的選項(xiàng)awk -F 指定輸入文件字段的分隔符
eg:
test2.awk:
1:2 3 4
2:3 18 2
a:b 17 1
awk -F ":" '{print $2}' test2.awk
2 3 4
3 18 2
b 17 1
把:換成\t之后:
awk -F ":" '{print $2}' test2.awk
空行
空行
空行
注:分隔符是空格時(shí),\t也是分隔符;但指定\t是分隔符時(shí),空格不是分隔符
awk的內(nèi)置函數(shù)split(“被切割的字符串”,數(shù)組名,”分隔符”)
toupper() 替換成大寫
tolower() 替換成小寫
gsub() 全局替換
length() 計(jì)算字符串的長(zhǎng)度
eg:
awk '{print length($3)}' test.awk
1
2
2
大例子業(yè)務(wù)場(chǎng)景
收藏排行榜
從收藏存量記錄、和取消收藏存量記錄中,提取出收藏排行榜
存量記錄中,$1是用戶uin,$6是漫畫id
思路:
1、把收藏存量記錄中的$1_$6作為一個(gè)key,放進(jìn)一個(gè)map,值是收藏時(shí)間
2、再?gòu)娜∠詹赜涗浿校?1_$6,對(duì)比時(shí)間,然后刪除(相當(dāng)于合并狀態(tài)),然后輸出結(jié)果
3、把數(shù)據(jù)結(jié)果用map記錄,計(jì)數(shù),輸出結(jié)果
4、把數(shù)據(jù)結(jié)果用sort逆序按數(shù)字大小排,然后把次數(shù)cut掉
對(duì)應(yīng)的腳本語句:
awk 'NR==FNR{a[$1"_"$6]=$7} NR>FNR{key=$1"_"$6;if((key in a)&&(a[key] < $7)){delete a[key]}} END{for(i in a){print i}}' allcollect03 allcancel03 | awk -F"_" '{b[$2]=b[$2]+1;} END{for(i in b){print i"\t"b[i]}}' | sort -r -n -k 2 | cut -f '1'