Entrada:
apple.LONG_UUID.BLAH.BLAH
orange
apple.ANOTHER_UUID
chair.01.AB
Saída desejada:
apple 1
orange
apple 2
chair
Comecei extraindo a substring antes do ponto com
while IFS= read -r line; do
echo "${line%%.*}"
done <<< "$list"
Isso me deu:
apple
orange
apple
chair
Não tenho certeza de como prosseguir a partir disso, tenha em mente que a lista real é muito maior e sempre única. A única coisa que persiste é que a parte importante do item está antes do ponto, se o ponto estiver presente.
Aqui está uma abordagem usando
awk
.-F .
define o ponto como separador de campo, o que dá acesso ao prefixo desejado em$1
. Na linha de iteração, três matrizes são preenchidas:a
obtém o prefixo,b
sua ocorrência atual, ambos indexados pelo número da linha (registro)NR
, enquantoc
agrega o maior número de ocorrências para cada prefixo. Após a última linha de entrada (END
), iteramos sobre os números de linha (de 1 até o finalNR
), emitindo os itens reais dea
(o prefixo), seguidos por um espaço e o número de ocorrência correspondente (deb
) se a contagem mais alta (dec
) para esse prefixo for maior que 1.Esse deve ser um processo de duas etapas: você não sabe se há duplicatas até ler a lista inteira.
No bash: