1. 程式人生 > 其它 >單元測試基礎 -- 基本概念

單元測試基礎 -- 基本概念

a、awk與sed的區別
awk用於”比較規範“的文字處理,用於統計數量並輸出欄位
sed將不規範的文字,處理成”比較規範“的文字

b、awk的流程控制
輸入資料前例承 BEGIN{}
主輸入迴圈 {}
所有檔案讀取完成例程 END{}

c、記錄和欄位
每行稱作AWK記錄
使用空格、製表符分割開的單詞稱作欄位
可以自定指定分割的欄位

d、欄位引用
awk中使用 $1 $2 ...$n表示每個欄位,$0代表當前行
awk '{print $1,$2,$2}' filename
awk可以使用-F選型改變欄位分割符
awk -F '{print $1,$2,$2}' filename
分隔符可以使用正則表示式

awk '/^menu/{print $0}' aa.txt
awk -F "," '/^menu/{print $2}' aa.txt

e、AWK表示式
賦值、算數、系統變數、關係操作符、布林操作符
賦值 = ++ -- += -- *= /= %= ^=

系統變數
FS和OFS欄位分隔符,OFS表示輸出的欄位分割符 (Filed Splite)
RS記錄分割符 (Record Splite)
NR和FNR行數 (Number Row) FNR支援多個檔案一起輸出
NF欄位數量,最後一個欄位內容可以用$NF取出 (Number Field)

head -5 /etc/passwd | awk -F ":" '{print $1}'
head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print $1}'
head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print $1,$2}' #輸出的多個變數使用,分割
head -5 /etc/passwd | awk 'BEGIN{FS=":";OFS="-"}{print $1,$2}' #指定欄位輸出OFS -
head -5 /etc/passwd | awk 'BEGIN{RS=":"}{print $0}' #指定行記錄分割符號為:

head -5 /etc/passwd | awk '{print NR}' #輸出行號
head -5 /etc/passwd | awk '{print NR,$0}' #輸出行號和該行記錄
awk '{print NR,$0}' /etc/passwd aa.txt #將多個檔案合併輸出
head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print NF}' #輸出每行列數
head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print $NF}' #輸出每行最後一個欄位

g、條件語句
if(表示式) awk語句1
else awk語句2

awk '{if($2>=70) print $1}' kpi.txt

i、迴圈
head -1 kpi.txt | awk '{for(c=2;c<=NF;c++) print c}' #取第一行,從第2個列到最後一個列數,輸出列號

head -1 kpi.txt | awk '{for(c=2;c<=NF;c++) print $c}' #輸出每列數值
head -1 kpi.txt | awk '{for(c=2;c<=NF;c++) sum+=$c;print sum}' #計算總分
head -1 kpi.txt | awk '{for(c=2;c<=NF;c++) sum+=$c;print sum/(NF-1)}' #計算平均分
awk '{sum=0; for(c=2;c<=NF;c++) sum+=$c; print $1,sum/(NF-1)}' kpi.txt #輸出每行平均分
awk '{sum=0; for(c=2;c<=NF;c++) sum+=$c; average[$1]=sum/(NF-1)}END{for(user in average) print user,average[user]}' kpi.txt

g、使用awk -f 執行awk命令
awk -f kpi.awk kpi.txt

kpi.awk
{sum=0; for(c=2;c<=NF;c++) sum+=$c; average[$1]=sum/(NF-1)}END{for(user in average) print user,average[user]}

{
sum=0;
for(c=2;c<=NF;c++)
sum+=$c
avage[$1]=sum/(NF-1)
}
END{
for(user in avage)
sum_all+=avage[user]
avg_all=sum_all/NR

for(user in avage)
if(avage[user]>=avg_all)
above++
else
below++

print above,below
}