2010-10-19 10 views

Respuesta

11

Sólo un comando awk

awk -vFS="" '{for(i=1;i<=NF;i++)w[$i]++}END{for(i in w) print i,w[i]}' file 

si quieres sensible a mayúsculas, añadir tolower()

awk -vFS="" '{for(i=1;i<=NF;i++)w[tolower($i)]++}END{for(i in w) print i,w[i]}' file 

y si desea que sólo los personajes,

awk -vFS="" '{for(i=1;i<=NF;i++){ if($i~/[a-zA-Z]/) { w[tolower($i)]++} } }END{for(i in w) print i,w[i]}' file 

y si quieres sólo dígitos, cambiar /[a-zA-Z]/ a /[0-9]/

si no desea mostrar Unicode, hacer export LC_ALL=C

+0

Gracias por su respuesta. – SkypeMeSM

+0

Lo siento, no estoy muy familiarizado con awk. La solución funciona pero obtengo todos los caracteres en lugar de solo caracteres alfanuméricos. awk -vFS = "" '{for (i = 1; i <= NF; i ++) w [tolower ($ i)] ++ sum ++} END {para (i en w) print i, w [i], w [i]/sum} ' – SkypeMeSM

+0

Gracias de nuevo. Me pregunto por qué obtengo resultados como ü 2 y é 2, cuando la expresión regular es [a-zA-Z]. – SkypeMeSM

2

Aquí es una sugerencia:

while read -n 1 c 
do 
    echo "$c" 
done < "$INPUT_FILE" | grep '[[:alpha:]]' | sort | uniq -c | sort -nr 
+0

Gracias por responder. – SkypeMeSM

6

Una solución con sed, sort y uniq:

sed 's/\(.\)/\1\n/g' file | sort | uniq -c 

Esto cuenta todos los personajes, no solo las letras. Puede filtrar con:

sed 's/\(.\)/\1\n/g' file | grep '[A-Za-z]' | sort | uniq -c 

Si usted desea considerar mayúsculas y minúsculas como lo mismo, basta con añadir una traducción:

sed 's/\(.\)/\1\n/g' file | tr '[:upper:]' '[:lower:]' | grep '[a-z]' | sort | uniq -c 
+0

Gracias.Esto considera caracteres mayúsculas y minúsculas como separadas. ¿Cómo puedo calcular las frecuencias donde consideramos A y a como lo mismo? – SkypeMeSM

+0

Sí, esto funciona muy bien también. Me pregunto cómo puedo calcular las probabilidades, es decir, frecuencia/suma total. Tendremos que conectar la salida de nuevo a sed, pero no puedo entender la expresión regular involucrada. – SkypeMeSM

+0

Puede agregar algunos 'wc',' cut', 'dc',' tee' y otros comandos, pero sería más malabares con las placas que un trabajo fácil de mantener. Creo que agregar más características sería más fácil con un script de Perl. – mouviciel

19

Mi solución usando grep, sort y uniq.

grep -o . file | sort | uniq -c 

Ignorar mayúsculas:

grep -o . file | sort -f | uniq -ic 
+0

¿cómo puedo obtener la frecuencia/suma (todas las frecuencias) después de esto? – SkypeMeSM

+0

Esto funciona con una terminal de mac. –

+0

@SkypeMeSM para obtener la frecuencia de cada carácter, simplemente divida por el número total de caracteres (que está dado por 'wc -c archivo'). –

0

similares a mouviciel de respuesta anterior, pero más genérico para Bourne y Korn proyectiles utilizados en sistemas BSD, cuando usted no tiene sed de GNU, que soporta \ n en un reemplazo, puede barra invertida una nueva línea:

sed -e's/./&\ 
/g' file | sort | uniq -c | sort -nr 

o para evitar la división visual en la pantalla, insertar una nueva línea literal por tipo CTRL + V CTRL + J

sed -e's/./&\^J/g' file | sort | uniq -c | sort -nr 
Cuestiones relacionadas