Você pode usar sed
, uniq
e sort
:
$ echo -n "aabbbddd" | sed 's/\(.\)/\n/g'| sort | uniq -c
2 a
3 b
3 d
O acima usa sed
para pegar cada caractere e substituí-lo por si próprio + uma nova linha ( \n
). Agora, com cada caractere em uma nova linha (e classificado), você pode usar uniq -c
para contar os caracteres.
OBSERVAÇÃO: Este método não mostrará nenhum dos caracteres intermediários que possuem zero ocorrências.
Como alternativa, mostrar a contagem de cada letra
$ s="aabbbddd"; for i in {a..z}; do
v=$(echo -n "$s" | grep -oi $i | wc -l); echo "$i : $v"; done
a : 2
b : 3
c : 0
d : 3
e : 0
f : 0
g : 0
h : 0
i : 0
j : 0
k : 0
l : 0
m : 0
n : 0
o : 0
p : 0
q : 0
r : 0
s : 0
t : 0
u : 0
v : 0
w : 0
x : 0
y : 0
z : 0
Isso funciona percorrendo todas as letras do alfabeto:
for i in {a..z}; do .... ; done
Cada iteração do loop percorre a string procurando por um caractere específico e usa a opção -o
de grep
para retornar apenas essas correspondências. Em seguida, usamos wc -l
para contar quantas ocorrências de cada letra encontramos e armazená-lo na variável $v
. Em seguida, exibimos cada iteração:
echo "$i : $v"
OBSERVAÇÃO: Essa abordagem pode manipular as sequências que estão fora de ordem.