Número de ocorrências de letras em uma palavra?

0

Eu gostaria de descobrir o número de ocorrências de cada um dos alfabetos em uma palavra. Por exemplo

entrada
aabbbddd 
saída
a@2 b@3 c@0 d@3

Como posso executar isso usando o script de shell?

    
por Rakesh R Nair 17.11.2014 / 07:14

2 respostas

2

Estas soluções não diferenciam maiúsculas de minúsculas:

start cmd:> echo aabbbddd | 
  awk -v FS= '{for (i=1;i<=NF;i++) a[tolower($i)]++;}; 
    END {for (key in a) print key ": " a[key];}'
a: 2
b: 3
d: 3

Ou para o alfabeto completo:

start cmd:> echo Aabbbddd | 
  awk -v FS= '{for (i=1;i<=NF;i++) a[tolower($i)]++;};
    END {chars="abcdefghijklmnopqrstuvwxyz";
    for (i=1;i<27;i++) { key=substr(chars,i,1);print key ": " a[key]};}'
a: 2
b: 3
c: 
d: 3
e: 
f: 
g: 
h: 
i: 
j: 
k: 
l: 
m: 
n: 
o: 
p: 
q: 
r: 
s: 
t: 
u: 
v: 
w: 
x: 
y: 
z:
    
por 17.11.2014 / 07:27
3

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.

    
por 17.11.2014 / 07:32