O script a seguir recebe seus argumentos da linha de comando em vez de um prompt. Isso facilita a reutilização de outros scripts e permite que o usuário especifique vários nomes de usuário.
$ cat jake.sh
#! /bin/sh
inputfile='input.txt'
for u in "$@" ; do
awk -F'|' -v u="$u" '$1 == u { sum = sum + $3 ; count++}
END {print u " has run " count " processes for a total of " \
sum " minutes."}' < "$inputfile"
done
Observe como o shell script passa a variável de shell $u
para o script awk por meio da opção -v u="$u"
. Isso evita ter que usar aspas duplas em torno do script awk para usar o shell $u
diretamente ... pois isso exigiria o escape de todas as instâncias de $1
, $3
e todo "
no script awk com um barra invertida \
.
A entrada é igual à do seu exemplo:
$ cat input.txt
oliver|Login|100
smith|Login|20
oliver|Time|25
oliver|Time|25
smith|Time|20
Anne|Login|100
E aqui está a saída:
$ ./jake.sh oliver smith Anne
oliver has run 3 processes for a total of 150 minutes.
smith has run 2 processes for a total of 40 minutes.
Anne has run 1 processes for a total of 100 minutes.
Se você realmente quisesse que ele solicitasse o nome de usuário, o script ficaria assim:
#! /bin/sh
inputfile='input.txt'
echo -n "User name?"
read username
awk -F'|' -v u="$username" '$1 == u { sum = sum + $3 ; count++}
END {print u " has run " count " processes for a total of " \
sum " minutes."}' < "$inputfile"