我有这样的文件,如下所示:
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
答案 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