回答:
以下が機能するはずです。
$ sed 's/\(.\)/\1\n/g' text.txt | sort | uniq -c
まず、すべての文字の後に改行を挿入し、各文字をそれぞれの行に配置します。次に、ソートします。次に、uniqコマンドを使用して重複を削除し、各行の先頭にその文字の出現回数を付けます。
リストを頻度でソートするには、これをすべてにパイプしsort -nr
ます。
sed
行う方法はあるかもしれませんが、Jacob VlijmのPythonソリューションはうまく機能しました。
スティーブンのソリューションは、優れたシンプルなソリューションです。ソート手順のため、非常に大きなファイル(RAMの約半分に快適に収まらないファイル)のパフォーマンスはそれほど高くありません。これがawkバージョンです。それはいくつかの特殊文字(改行、のために正しいことを行うためにしようとするので、それはまた、もう少し複雑です'
、\
、:
)。
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/:/'
同じ原則に基づいたPerlソリューションを次に示します。Perlには、内部でソートできるという利点があります。また、ファイルが改行文字で終わっていない場合、これは余分な改行を正しくカウントしません。
perl -ne '
++$c{$_} foreach split //;
END { printf "'\''%s'\'': %d\n", /[\\'\'']/ ? "\\$_" : /./ ? $_ : "\\n", $c{$_}
foreach (sort {$c{$b} <=> $c{$a}} keys %c) }'
sed 's/\(.\)/\1\'$'\n/g' text.txt