2017-09-06 58 views
-1

我有這樣一個文件,內容如下:如何通過awk統計內容?

2017-08-25 03:39:09 20005 login 0 
2017-08-25 03:45:59 20005 logout 410 
2017-08-25 03:46:42 10007 login 0 
2017-08-25 03:46:58 20005 logout 469 
2017-08-25 03:46:58 20005 logout 469 
2017-08-25 03:47:28 20005 logout 499 
2017-08-25 03:50:41 20007 login 0 
2017-08-25 03:51:55 20007 logout 74 
2017-08-25 03:54:55 20007 logout 74 

是否有可能使用awk計數像這樣:

2017-08-25 03:39:09 20005 login 0 
2017-08-25 03:45:59 20005 logout 410 
2017-08-25 03:46:42 10007 login 0 
2017-08-25 03:50:41 20007 login 0 
2017-08-25 03:51:55 20007 logout 74 
+1

你是什麼意思?忽略後續註銷行? –

+0

是的,我想通過忽略重複註銷行來計算數字列avg。 – wonderful60

+0

平均得分?示例不明確。 –

回答

1

AWK腳本:

$ cat tst.awk 
/logout/ {if (a[$3]++) next} 
/login/{delete a[$3]} 
{print} 

與此配合使用:

awk -f tst.awk input.txt 

,或者使用oneliner:

awk '/logout/{if (a[$3]++) next} /login/{delete a[$3]} {print}' input.txt 

它給你:

$ awk -f tst.awk input.txt 
2017-08-25 03:39:09 20005 login 0 
2017-08-25 03:45:59 20005 logout 410 
2017-08-25 03:46:42 10007 login 0 
2017-08-25 03:50:41 20007 login 0 
2017-08-25 03:51:55 20007 logout 74 
1

AWK解決方案:

awk '($4=="login" && !($3 in a)) || ($4=="logout" && a[$3]=="login"){ a[$3]=$4; print }' file 
  • ($4=="login" && !($3 in a)) - 如果用戶登錄,首先,將其標記爲登錄a[$3]=$4

  • $4=="logout" && a[$3]=="login" - 如果登錄用戶做註銷的動作(在第一) - 將其標記爲註銷(不進一步的處理)

輸出:

2017-08-25 03:39:09 20005 login 0 
2017-08-25 03:45:59 20005 logout 410 
2017-08-25 03:46:42 10007 login 0 
2017-08-25 03:50:41 20007 login 0 
2017-08-25 03:51:55 20007 logout 74 
+0

非常感謝你,你的方式也可以。 – wonderful60