awk: linha em branco com data

3

Eu uso o seguinte código para escrever os números de processo dos usuários on-line e a data em que eles foram verificados:

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

Eu tenho um problema. Depois que eu corro o script, ele me dá uma linha + para a primeira análise, onde ela me dá um espaço em branco para usr, 1 para process num e a data, após o que me fornece os usuários reais e outras coisas. Você pode me ajudar a consertar isso? Ou existe uma função para isso?

    
por MEZesUBI 27.06.2014 / 00:50

2 respostas

1

Eu posso entender mal a intenção do seu script, mas não seria mais simples construir uma matriz contendo as contagens de cada usuário? algo como

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}
'
    
por 27.06.2014 / 02:00
3

Seu problema é que usr é unitalizado e, pela primeira vez durante o loop, usr não é igual a $1 , então você imprime a linha.

Você pode adicionar um bloco BEGIN ao código do awk:

BEGIN { usr = blank }

e, em seguida, dentro do if interno, verifique essa condição antes de imprimir:

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

Tags