Comment puis-je countr le nombre de caractères différents dans un file?

J'ai besoin d'un programme qui affiche le nombre de caractères différents dans un file. Exemple:

> stats testfile ' ': 207 'e': 186 'n': 102 

Existe un outil, qui le fait?

Les points suivants devraient fonctionner:

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

Tout d'abord, nous insérons une nouvelle ligne après chaque caractère, en mettant chaque personnage sur sa propre ligne. Ensuite, nous le sortingerons. Ensuite, nous utilisons la command uniq pour supprimer les duplicates, en préfixant chaque ligne avec le nombre d'occurrences de ce caractère.

Pour sortinger la list par fréquence, il faut tout faire dans le sort -nr .

La solution de Steven est bonne et simple. Ce n'est pas si performant pour les files très volumineux (files qui ne rentrent pas confortablement dans la moitié de votre RAM) en raison de l'étape de sorting. Voici une version awk. C'est aussi un peu plus compliqué car il essaie de faire la bonne chose pour quelques personnages spéciaux (newlines, ' , \ ,:).

 awk ' {for (i=1; i<=length; i++) ++c[substr($0,i,1)]; ++c[RS]} function chr (x) {return x=="\n" ? "\\n" : x==":" ? "\\072" : x=="\\" || x=="'\''" ? "\\" x : x} END {for (x in c) printf "'\''%s'\'': %d\n", chr(x), c[x]} ' | sort -t : -k 2 -r | sed 's/\\072/:/' 

Voici une solution Perl sur le même principe. Perl a l'avantage de pouvoir sortinger en interne. En outre, cela ne countra pas correctement une nouvelle ligne si le file ne se termine pas par un caractère de nouvelle ligne.

 perl -ne ' ++$c{$_} foreach split //; END { printf "'\''%s'\'': %d\n", /[\\'\'']/ ? "\\$_" : /./ ? $_ : "\\n", $c{$_} foreach (sort {$c{$b} <=> $c{$a}} keys %c) }'