답변:
다음이 작동해야합니다.
$ sed 's/\(.\)/\1\n/g' text.txt | sort | uniq -c
먼저 모든 문자 뒤에 줄 바꿈을 삽입하여 각 문자를 자체 줄에 넣습니다. 그런 다음 정렬합니다. 그런 다음 uniq 명령을 사용하여 중복을 제거하고 각 줄 앞에 해당 문자의 발생 횟수를 붙입니다.
빈도별로 목록을 정렬하려면이 항목을 모두로 파이프하십시오 sort -nr
.
sed
이것을 할 수있는 방법이있을 수 있지만 Jacob Vlijm의 Python 솔루션 은 저에게 효과적이었습니다.
Steven의 솔루션은 훌륭하고 간단합니다. 정렬 단계 때문에 매우 큰 파일 (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