爲了統計API的訪問,須要讀取8個G的數據,因此學習了下文本處理神器,AWK。簡單實例以下:api
# 以\t分割的文本
awk -F "\t" ' //獲取小時的函數 function getHours(times){ split (times, t, ":"); return t[3]; }
//awk 可分爲三個部分:
//中間部分 {} ,表示對每行的處理,
//BEGIN 表示每行處理以前的預處理,
//END 表示逐行處理以後的最終處理
// 三個部門並不須要同時存在,但中間逐行處理確定是須要的。
BEGIN{ tilte_cnt = 0; } {
// $1 表示,每行按照\t分割後,獲取的第一個字串
h = int(getHours($1)); flag = 0; // 中間能夠有for循環,數組等。
// 二維數組能夠用 a[xx,xx]表示,實現是經過創建xx,xx的哈希實現的,並非真正的二維數組
for(i = 0; i < title_cnt; i ++){ if (title[i] == $2){ tmp[h,i] += 1; flag = 1; break; } } if (0 == flag){ title[title_cnt] = $2; for (i = 0; i < 24; i++) { tmp[i,title_cnt] = 0; } tmp[h,title_cnt] = 1; ++title_cnt; } }END{ iter = 0; // 有不少類C函數
printf("%s,", "api");
for (i = 0; i < 24;i++){ printf("%d,", i); } printf("\n"); for (i = 0; i < title_cnt; i++){ printf("%s,", title[i]); for (j = 0; j < 24; j++){ printf("%d,", tmp[j,i]); } printf("\n"); } } ' api_log.res > api.analysis # 重定向到api.analysis 中