使用awk的二維數組解決一個日誌統計的實際問題


項目中遇到的一個實際問題,日誌以下c#

2013-09-13 00:06:09:adid:10000254
2013-09-13 00:06:14:adid:10000254
2013-09-13 00:06:43:adid:10000253
2013-09-13 00:06:48:adid:10000254
2013-09-13 00:07:07:adid:10000254
2013-09-13 00:07:12:adid:10000254
2013-09-13 00:07:19:adid:10000254
2013-09-13 00:07:32:adid:10000254
2013-09-13 00:08:05:adid:10000254
2013-09-13 00:08:20:adid:10000240
2013-09-13 00:08:28:adid:10000253
2013-09-13 00:08:32:adid:10000253
2013-09-13 00:08:41:adid:10000254
2013-09-13 00:09:02:adid:10000253
2013-09-13 00:09:10:adid:10000254
2013-09-13 00:09:11:adid:10000240
2013-09-13 00:09:18:adid:10000254
2013-09-13 00:09:19:adid:10000254
2013-09-13 00:09:27:adid:10000254
2013-09-13 00:09:28:adid:10000240
2013-09-13 00:09:32:adid:10000253
2013-09-13 00:09:34:adid:10000240
2013-09-13 00:09:59:adid:10000253
2013-09-13 00:10:05:adid:10000254
2013-09-13 00:10:07:adid:10000253

    我想要按照小時去統計adid的個數awk的多維數組在本質上是一維數組,更確切一點,awk在存儲上並不支持多維數組。awk提供了邏輯上模擬二維數組的訪問方式。例如,array[2,4] = 1這樣的訪問是容許的。awk使用一個特殊的字符串SUBSEP (\034)做爲分割字段,在上面的例子中,關聯數組array存儲的鍵值其實是2\0344。 數組

    相似一維數組的成員測試,多維數組能夠使用 if ( (i,j) in array)這樣的語法,可是下標必須放置在圓括號中。相似一維數組的循環訪問,多維數組使用 for ( item in array )這樣的語法遍歷數組。與一維數組不一樣的是,多維數組必須使用split()函數來訪問單獨的下標份量。split ( item, subscr, SUBSEP)。
代碼以下:
函數

awk '
BEGIN{
ay[1,10]=5;
ay[10,2]=12;
}
END{
for (k in ay) {
   split(k,idx,SUBSEP);
   print idx[1],idx[2],ay[idx[1],idx[2]];
   }
}'
或者
awk '
BEGIN{
ay[1,10]=5;
ay[10,2]=12;
}
END{
for (k in ay) {
   print k,ay[k];
   }
}'

獲得結果以下:測試

2013-09-13 00 10000239 76
2013-09-13 00 10000240 155
2013-09-13 00 10000253 89
2013-09-13 00 10000254 148
2013-09-13 01 10000180 121
2013-09-13 01 10000181 83
2013-09-13 01 10000239 42
2013-09-13 01 10000240 139
2013-09-13 01 10000253 56
2013-09-13 01 10000254 80
2013-09-13 02 10000180 46
2013-09-13 02 10000181 56
2013-09-13 02 10000239 16
2013-09-13 02 10000240 86
2013-09-13 02 10000253 26
2013-09-13 02 10000254 45
相關文章
相關標籤/搜索