Se o usuário inserir os detalhes dos funcionários como string e quisermos que a saída exiba o salário médio do departamento e a saída deve estar na mesma ordem em que aparecem na string de entrada.
Por exemplo, string de entrada:
EMP101:Jack:HR:6000#EMP102:Jill:Management:10000#EMP103:Russell:Testing:10000#EMP104:Monica:HR:15000#EMP105:John:Management:25000#EMP106:Ram:Testing:8000#EMP107:Tan:HR:15000#EMP108:Harry:Management:10000
Cadeia de saída:
HR:12000#Management:15000#Testing:9000
Tentei abaixo o código:
echo "EMP101:Jack:HR:6000#EMP102:Jill:Management:10000#EMP103:Russell:Testing:10000#EMP104:Monica:HR:15000#EMP105:John:Management:25000#EMP106:Ram:Testing:8000#EMP107:Tan:HR:15000#EMP108:Harry:Management:10000" \
| awk 'BEGIN{RS="#"; OFS=FS=":"} {gsub(/"\n$/,"",$5); print $3,$4}' \
| awk -F ":" '{a[$1] += $2} {b[$1] += 1} END{for (i in a) print i, a[i]/b[i]}' \
| tr " " ":" \
| tr "\n" "#";
obteve a saída como:
:0#Testing:9000#Management:15000#HR:12000
Isso não é o que eu quero e também não estou entendendo por que :0#
está sendo adicionado no início da string. Alguém poderia me dizer como conseguir isso no script de shell
Usando any
awk
e preservando a ordem:Resultado:
Usamos a
ordrDept
matriz para lembrar a ordem de cada departamento pela ordem em que foram vistos.Usamos a
dept
matriz para resumir o salário total de cada departamento.Usamos o
seenDept
array para lembrar quantas vezes eles foram vistos.no
END{...}
bloco, ei
seria o número máximo de departamentos existentes que visitamos emordrDept[++i]=$3
, então estamos imprimindo-os na ordem que visitamos primeiro porordrDept[o]
, depois o cálculo do salário médiototal/count
por departamento e com(i==o)?ORS:RS
isso estamos controlando os separadores.Uma implementação alternativa da abordagem acima com nomes de variáveis mais significativos seria (graças a @EdMorton):
Outra variação de um tema
Resultado
O
:0#
é devido a uma linha adicional, à direita, vazia em sua entrada/arquivo. Sua tentativa de remover isso falha porque você forneceu o padrão erradogsub(...)
, bem como um campo que não existe.RS
Corrija isso ou use uma variável estendida . Comoawk
por si só é bastante poderoso, não há necessidade de executar essa pilha de tubos; fazê-lo em umawk
só.Tentar
A remoção do ORS à direita fica como exercício para o leitor.
Aqui está um método usando perl .
As estruturas de dados envolvidas:
Abaixo está um método retirado de sua tentativa
A abordagem GNU sed é fornecida. A ideia é juntar o mesmo departamento e separar os salários dentro do mesmo departamento.