¿Número de apariciones de letras en una palabra?

¿Número de apariciones de letras en una palabra?

Me gustaría saber el número de apariciones de cada uno de los alfabetos en una palabra. P.ej

aporte
aabbbddd 
producción
a@2 b@3 c@0 d@3

¿Cómo puedo realizar esto usando un script de shell?

Respuesta1

Podrías usar sed, uniqy sort:

$ echo -n "aabbbddd" | sed 's/\(.\)/\1\n/g'| sort | uniq -c
  2 a
  3 b
  3 d

Lo anterior utiliza sedpara tomar cada carácter y reemplazarlo por sí mismo + una nueva línea ( \n). Ahora, con cada carácter en una nueva línea (y ordenado), puedes usarlo uniq -cpara contar los caracteres.

NOTA:Este método no mostrará ninguno de los caracteres intermedios que no tengan apariciones.

Alternativamente mostrar el recuento 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

Esto funciona recorriendo todas las letras del alfabeto:

 for i in {a..z}; do .... ; done

En cada iteración del bucle, buscamos la cadena en busca de un carácter específico y usamos la -oopción de greppara devolver solo estas coincidencias. Luego usamos wc -lpara contar cuántas apariciones de cada letra encontramos y las almacenamos en la variable $v. Luego mostramos cada iteración:

 echo "$i : $v"

NOTA:Este enfoque puede manejar que las cadenas estén desordenadas.

Respuesta2

Estas soluciones no distinguen entre mayúsculas y 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

O para el 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:

Respuesta3

Usando solo el shell (más rápido para cadenas cortas):

#! /bin/bash -
input=${*:-'aabbbddd'}

tmp=$input
arr=()
maxlen=0
maxchar=''
while ((${#tmp})); do
    firstchar=${tmp:0:1}
    next=${tmp//"$firstchar"}
    len=$((${#tmp}-${#next}))
    arr+=("$firstchar: $len")
    if ((maxlen<len)); then
    maxlen=$len
    maxchar=$firstchar
    fi
    tmp=$next
done

printf '%s\n' "${arr[@]}" 
echo "The char \"$maxchar\" appear $maxlen times in \"$input\""

Llamado:

$ ./script
a@2 b@3 d@3 
The char "b" appear 3 times in "aabbbddd"

información relacionada