如何用awk计算内容?

时间:2017-09-06 03:14:19

标签: mysql unix awk count

我有这样的文件,如下所示:

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

2 个答案:

答案 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 :(得分: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" - 如果 已记录 ,则用户执行注销操作(首先) - 将其标记为 已注销< / em> (无需进一步处理)

输出:

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