2017-09-06 1 views
-1

Je dispose d'un fichier comme celui-ci, comme suit:Comment compter le contenu par 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 

Est-il possible d'utiliser awk compter comme ceci:

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

Que voulez-vous dire? Ignorer les lignes de déconnexion de suivi? –

+0

oui, je veux compter la colonne de nombre avg en ignorant la ligne de déconnexion de répétition. – wonderful60

+0

Moy de quoi? L'exemple n'est pas clair. –

Répondre

1

scripts awk:

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

Utilisez ceci avec:

awk -f tst.awk input.txt 

ou, utilisez un oneliner:

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

qui vous donne:

$ 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

court awk solution:

awk '($4=="login" && !($3 in a)) || ($4=="logout" && a[$3]=="login"){ a[$3]=$4; print }' file 
  • ($4=="login" && !($3 in a)) - si l'utilisateur se connecte d'abord, marquer comme connecté a[$3]=$4

  • $4=="logout" && a[$3]=="login" - si connecté utilisateur enregistrons une action (au début) - marquer comme DÉCONNECTÉ (sans un traitement ultérieur)

La sortie:

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

Merci beaucoup, votre chemin est également ok. – wonderful60