awk的工作模式: 將文本數(shù)據(jù)先進行一行一行做分割,再以某種定義將行數(shù)據(jù)分割為字段數(shù)據(jù),形成基本的數(shù)據(jù)單位, 然后執(zhí)行awk中的代碼;
字段: 從awk的角度看, 本文的基本組成單位為字段, 所以awk處理的數(shù)據(jù)對象就是字段;
注: 默認以空白為分割, 將一行文本分割成若干字段, 其中 $number 就表示某個字段
猜測: $0 代表的是當(dāng)前所在行的行內(nèi)容;
awk -F'正則表達式' '{print $number}' 按照某種規(guī)則分割字段
awk中內(nèi)置的變量:
NF number final 每一行的字段總數(shù),也就是最后一列所在的列數(shù);
NR number row 保存的值是文件數(shù)據(jù)的行數(shù),是總行數(shù)
FNR 保存的值是單個文本數(shù)據(jù)的行數(shù)值
自定義變量語法: -v 變量名=xxx; 簡化寫法: 變量名=xxx
猜測: awk中數(shù)組的聲明語法: 數(shù)組名[下標(biāo)名稱]="存儲數(shù)據(jù)"
BEGIN 用于給變量賦初始值; END 用于輸出結(jié)果
awk中 '' 單引號引起來的部分就是awk的代碼:其組成由 判斷+{代碼塊} 為單位組成;
基本單位形式: 判斷+{代碼塊}
判斷 : 就是用于判斷此行有沒有資格執(zhí)行判斷后面的 {代碼塊} 代碼塊,用作判斷依據(jù)的可以是NR和正則表達式,或者&&兩者共同用作判斷條件;
注: /正則表達式/ 書寫正則表達式的語法;
{代碼塊} : 本身就相當(dāng)于java中某個方法體內(nèi)的代碼塊;當(dāng)然,其內(nèi)部可以寫if,for等等代碼;
print 方法自帶換行符; printf 方法不帶換行符;
awk可以重定向,將內(nèi)容輸出到某個文件下, 記得給文件名加 "" 雙引號;
練習(xí)題:
統(tǒng)計一個文件有多少個單詞?
統(tǒng)計一個文件中某個單詞出現(xiàn)的次數(shù)?
awk '{for(i=1;i<=NF;i++){if("word"==$i)num++}} END{print num}' filepath
分組求解和:
awk -F "\t" '
BEGIN{
print "分段 \t 天數(shù)"
g13 = 0
g34 = 0
g45 = 0
g56 = 0
g67 = 0
g78 = 0
g8up = 0
}
{
if(($5+$6+$7) < 30000){
g13 ++
} else if(($5+$6+$7) >= 30000 && ($5+$6+$7) < 40000){
g34 ++
} else if(($5+$6+$7) >= 40000 && ($5+$6+$7) < 50000){
g45 ++
} else if(($5+$6+$7) >= 50000 && ($5+$6+$7) < 60000){
g56 ++
} else if(($5+$6+$7) >= 60000 && ($5+$6+$7) < 70000){
g67 ++
} else if(($5+$6+$7) >= 70000 && ($5+$6+$7) < 80000){
g78 ++
} else{
g8up ++
}
}
END{
print "1-3",g13
print "3-4",g34
print "4-5",g45
print "5-6",g56
print "6-7",g67
print "7-8",g78
print "8up",g8up
}
filepath