Bash Script Чтобы найти частоту каждой буквы в файле
Вопрос
Я пытаюсь выяснить частоту появления каждой буквы в английском алфавите в входном файле. Как я могу сделать это в сценарии Bash?
Решение
Только одна команда awk
awk -vFS="" '{for(i=1;i<=NF;i++)w[$i]++}END{for(i in w) print i,w[i]}' file
Если вы хотите нечувствителен к случаю, добавьте tolower()
awk -vFS="" '{for(i=1;i<=NF;i++)w[tolower($i)]++}END{for(i in w) print i,w[i]}' file
И если вы хотите только персонажи,
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
И если вы хотите только цифры, изменить /[a-zA-Z]/
к /[0-9]/
Если вы не хотите показывать Unicode, сделайте export LC_ALL=C
Другие советы
Мое решение с использованием grep
, sort
и uniq
.
grep -o . file | sort | uniq -c
Игнорировать случай:
grep -o . file | sort -f | uniq -ic
Решение с sed
, sort
и uniq
:
sed 's/\(.\)/\1\n/g' file | sort | uniq -c
Это считает все персонажи, не только буквы. Вы можете отфильтроваться с:
sed 's/\(.\)/\1\n/g' file | grep '[A-Za-z]' | sort | uniq -c
Если вы хотите рассмотреть прописные и строчные буквы как же, просто добавьте перевод:
sed 's/\(.\)/\1\n/g' file | tr '[:upper:]' '[:lower:]' | grep '[a-z]' | sort | uniq -c
Вот предложение:
while read -n 1 c
do
echo "$c"
done < "$INPUT_FILE" | grep '[[:alpha:]]' | sort | uniq -c | sort -nr
Похоже, что на ответ Mouviciel выше, но более универсальный для раковин Bourne и Korn, используемых на системах BSD, когда у вас нет GNU SED, который поддерживает N в замене, вы можете отступить отсюда.
sed -e's/./&\
/g' file | sort | uniq -c | sort -nr
Или избежать визуального разделения на экране, вставьте буквальную новую линию по типу Ctrl + V Ctrl + J
sed -e's/./&\^J/g' file | sort | uniq -c | sort -nr