Como inserir uma soma derivada do awk no meio da saída de texto [closed]

2

Estou tentando imprimir uma soma no meio de uma linha. Meu script solicita um nome de usuário e, em seguida, extrai um número total de processos e um total de tempo para esse usuário de um arquivo.

Eu quero imprimir uma frase com os totais no meio da frase.

Usando awk , posso obter os totais de processos e minutos, mas não consigo imprimir os resultados de uma equação no meio de uma frase. O resultado da minha equação aparece depois da frase.

Eu sinto que preciso usar uma âncora como em HTML. Eu estou usando o PuTTY.

 oliver|Login|100
 smith|Login|20
 oliver|Time|25
 oliver|Time|25
 smith|Time|20
 Anne|Login|100

Example: User name? oliver
oliver has run 3 processes for a total of 150 minutes

 case $choice" in
   1) echo -n "User name?"
    read username
    echo "$username has run processes for a total of minutes"
    ;;

Eu gostaria de obter um total de processos e minutos para o nome de usuário específico inserido. Em seguida, insira esses números na frase em que eles pertencem.

    
por jake 14.11.2015 / 07:02

1 resposta

2

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"
    
por 14.11.2015 / 07:28