Bash Script Чтобы найти частоту каждой буквы в файле

StackOverflow https://stackoverflow.com/questions/3966820

  •  09-10-2019
  •  | 
  •  

Вопрос

Я пытаюсь выяснить частоту появления каждой буквы в английском алфавите в входном файле. Как я могу сделать это в сценарии 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top