paulo1205
(usa Ubuntu)
Enviado em 17/02/2020 - 17:09h
A solução do msoliver funciona. Contudo, acho importante notar que ela tem complexidade quadrática (no pior caso, um arquivo com N linhas vai ser inteiramente processado N vezes) e produz uma saída que altera a ordem dos elementos, o que pode até ser aceitável, mas não corresponde ao exemplo de saída mostrado pelo OP.
Uma forma mais otimizada de fazer é fazer numa passada só, e usar o recurso de
array associativo do
bash ou
ksh para verificar se uma palavra nova existe e então recuperar o valor inteiro associado, ou associar-lhe um valor inteiro novo, caso ainda não exista. A principal vantagem de fazer desse modo é que a complexidade do algoritmo passa de quadrática para essencialmente linear (assumindo que o
array associativo tem complexidade constante, o que costuma ser aproximadamente verdadeiro quando são implementados com tabelas
hash). Por outro lado, como o
shell usa seus
arrays associativos exclusivamente em memória, um arquivo de entrada excessivamente grande poderia provocar esgotamento de recursos.
Não vou colocar aqui nenhum exemplo porque não sei se a pergunta se refere a trabalho escolar. Contudo, para aprender a usar
arrays associativos, a documentação do Bash é mais do que suficiente, e existem exemplos de uso aqui mesmo, nesta comunidade do fórum.
... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)