Bash скрипт для поиска частоты каждой буквы в файле - PullRequest
20 голосов
/ 19 октября 2010

Я пытаюсь выяснить частоту появления каждой буквы английского алфавита во входном файле. Как я могу сделать это в скрипте bash?

Ответы [ 5 ]

24 голосов
/ 19 октября 2010

Мое решение с использованием grep, sort и uniq.

grep -o . file | sort | uniq -c

Игнорировать регистр:

grep -o . file | sort -f | uniq -ic
15 голосов
/ 19 октября 2010

Всего одна команда 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]/

, если вы не хотите показывать юникод, введите export LC_ALL=C

6 голосов
/ 19 октября 2010

Решение с 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
4 голосов
/ 19 октября 2010

Вот предложение:

while read -n 1 c
do
    echo "$c"
done < "$INPUT_FILE" | grep '[[:alpha:]]' | sort | uniq -c | sort -nr
0 голосов
/ 15 мая 2013

Аналогично ответу 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
...