Awk
1. 打印文件的某列:
awk '{print $2}' handdata
注:handdata為文件名,其中的$1..$n表示第幾例着茸。注:$0表示整個行
2. 過濾記錄:
awk '$2==0 ' handdata
注:篩選出第二列為零的
awk '$2==0 && $3>10' handdata
注:篩選出第二列等于0贮泞,第三列>10的
篩選等于字符串的條件需要用雙引號
awk '$2==”xxx”' handdata
awk '$2==0 && $3>10 {print $0}' handdata
注:篩選出第二列等于0蘸鲸,第三列>10的后荤堪,打印全部
如果我們需要表頭的話谜喊,我們可以引入內(nèi)建變量NR
Eg:awk '$2==0 && $3>10 || NR==1' handdata
3. awk指定分隔符
FS : 輸入字段分隔符顺少,默認空白(空格或者tab)朋其。
RS : 輸入行分隔符,默認\n脆炎。
OFS : 輸出字段分隔符梅猿,默認空格。
ORS : 輸出行分隔符秒裕,默認\n
cat tcomvv160907 |awk -F"\t" '{print $16}'|more
打印 tcomvv160907文件按\t分割的第十六列
cat tcomvv160907 |awk -F"\t" '$16==0 {print $0}'
指定輸入輸出分隔符
head -n 5000 part-m-00000 |awk 'BEGIN{FS="\001";OFS="\t"} $30 == "電子商務" {print $1,$30}'
代碼中輸入分隔符為\001,輸出分隔符為\t
統(tǒng)計某一列不重復的數(shù)量
awk -F"\001" '{cnt[$19]=1}END{print length(cnt)}' part-m-00000
4.對列求和:
cat session160905new|awk '{sum+=$2} END {print "Sum = ", sum}'
5.或操作
驗證第三個字的值是否在1-20范圍內(nèi)袱蚓,可以打印出不符合要求的數(shù)據(jù)來驗證,使用了默認處理{print $0}(不指定Action則使用默認的Action):
awk -F',' '$3<1 || $3>20' data.csv
6.處理一個大日志文件几蜻,只想隨機抽取其中一些樣本來進行分析
awk 'rand()<0.1' log.csv > sample.csv
在模式中喇潘,使用了rand()函數(shù)來隨機產(chǎn)生0,1之間的小數(shù),只有當前產(chǎn)生的值小于0.1才打印當前行梭稚,即只隨機抽取10%的數(shù)據(jù)作為樣本响蓉。
7.倒數(shù)
打印日志的字段數(shù)使用變量NF,最后一列數(shù)據(jù)使用變量$NF哨毁,倒數(shù)第二列使用$(NF-1):
$ awk '{print NF, $NF枫甲,$(NF-1)}' log.csv