Я пытаюсь выяснить частоту появления каждой буквы в английском алфавите во входном файле. Как это сделать в bash script?
Bash script, чтобы найти частоту каждой буквы в файле
Ответ 1
Только одна команда 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
Ответ 2
Мое решение с использованием grep
, sort
и uniq
.
grep -o . file | sort | uniq -c
Игнорировать регистр:
grep -o . file | sort -f | uniq -ic
Ответ 3
Решение с 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
Вот предложение:
while read -n 1 c
do
echo "$c"
done < "$INPUT_FILE" | grep '[[:alpha:]]' | sort | uniq -c | sort -nr
Ответ 5
Как и в случае с 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