Vamos considerar isso como um arquivo de entrada de amostra:
$ cat file
jim|process1|23
bob|process2|5
jim|process3|7
Usando o awk
Agora, vamos criar este script de shell:
$ cat script.sh
#!/bin/sh
read -p "Please Enter a UserName: " uname
awk -v n="$uname" -F\| '$1==n{total+=$3} END{printf "Total for %s is %s minutes\n",n,total}' file
Como exemplo, vamos resumir o tempo usado por jim:
$ sh script.sh
Please Enter a UserName: jim
Total for jim is 30 minutes
Como funciona
O awk implicitamente percorre todas as linhas do arquivo de entrada. Esse script usa duas variáveis: n
, que é o nome de usuário e total
, que é o total de minutos em execução usado pelo usuário n
.
-
-v n="$uname"
Isso cria uma variável
n
do awk e atribui a ela o valor da variáveluname
da variável. -
-F\|
Isso diz ao awk para usar
|
como o separador de campo -
$1==n{total+=$3}
Sempre que o primeiro campo,
$1
, corresponder ao nome do usuário,n
, incrementamos o totaltotal
pela quantidade do terceiro campo,$3
. -
END{printf "Total for %s is %s minutes\n",n,total}
Quando terminamos de ler o arquivo, imprimimos o resultado.
Usando o shell
Como alternativa, podemos fazer o loop no shell:
$ cat script2.sh
#!/bin/sh
read -p "Please Enter a UserName: " uname
while IFS=\| read -r name process minutes; do
[ "$name" = "$uname" ] && total=$((total+minutes))
done <file
echo "Total for $uname is $total minutes"
Como demonstração:
$ sh script2.sh
Please Enter a UserName: jim
Total for jim is 30 minutes
Não cronometrei as duas abordagens, mas espero que awk
seja muito mais rápido.