awk: Ligne blanche avec date

J'utilise le code suivant pour écrire les numéros de process des users en ligne et la date à laquelle ils ont été vérifiés:

w | tail -n +3 | awk ' { "date +%H:%M:%S" | getline tim} {if ($1 != "") { if (usr != $1) {printf("%s\t%d\t%s\n",usr, num, tim); usr = $1; num = 1 } else {num++} } } END{ if ($1 != "") if (num !=0) printf("%s\t%d\t%s\n",usr, num, tim);} ' > test2 echo 

J'ai un problème. Après avoir exécuté le script, il me donne une ligne + pour la première parsing, où il me donne un blanc pour usr, 1 pour le nombre de process et la date, après quoi il me donne les users réels et d'autres choses. Peux-tu m'aider à le réparer? Ou existe-t-il déjà une fonction pour cela?

J'ai peut- être mal compris l'intention de votre script, mais ne serait-il pas plus simple de build un tableau contenant les counts pour chaque user? quelque chose comme

 w | awk ' BEGIN{"date +%H:%M:%S" | getline tim}; NR > 2 {num[$1]++}; END {for (usr in num) print usr, num[usr], tim} ' 

ou

 w | awk -v tim="$(date +%H:%M:%S)" ' NR > 2 {num[$1]++}; END {for (usr in num) print usr, num[usr], tim} ' 

Votre problème est que usr est unitialized, et la première fois à travers la boucle, usr n'est pas égal $1 , donc vous imprimez la ligne.

Vous pouvez append un bloc BEGIN au code awk:

 BEGIN { usr = blank } 

et, puis à l'intérieur de l'intérieur if , vérifiez cette condition avant d'imprimer:

 ... { if (usr != $1) { if (usr != blank) { printf("%s\t%d\t%s\n",usr, num, tim); } usr = $1; num = 1 } ...