用于查找文件中每个字母的频率的 Bash 脚本

Posted

技术标签:

【中文标题】用于查找文件中每个字母的频率的 Bash 脚本【英文标题】:Bash script to find the frequency of every letter in a file 【发布时间】:2011-04-27 09:06:30 【问题描述】:

我试图找出输入文件中英文字母表中每个字母的出现频率。如何在 bash 脚本中执行此操作?

【问题讨论】:

你为什么要为此使用 bash? 在某处发现了这个编程问题!!我想 perl 会是更好的选择,不是吗? 【参考方案1】:

与上述 mouviciel 的回答类似,但对于 BSD 系统上使用的 Bourne 和 Korn shell 更通用,当您没有 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

【讨论】:

【参考方案2】:

只有一个 awk 命令

awk -vFS="" 'for(i=1;i<=NF;i++)w[$i]++ENDfor(i in w) print i,w[i]' file

如果要不区分大小写,请添加tolower()

awk -vFS="" 'for(i=1;i<=NF;i++)w[tolower($i)]++ENDfor(i in w) print i,w[i]' file

如果你只想要字符,

awk -vFS="" 'for(i=1;i<=NF;i++) if($i~/[a-zA-Z]/)  w[tolower($i)]++  ENDfor(i in w) print i,w[i]' file

如果您只想要数字,请将 /[a-zA-Z]/ 更改为 /[0-9]/

如果您不想显示 unicode,请使用 export LC_ALL=C

【讨论】:

对不起,我对 awk 不是很熟悉。该解决方案有效,但我得到的是所有字符,而不仅仅是字母数字字符。 awk -vFS="" 'for(i=1;i 再次感谢。我想知道当正则表达式为 [a-zA-Z] 时,为什么会得到像 ü 2 和 é 2 这样的结果。 那是因为 gawk 的正则表达式适用于 unicode 字符。 (UTF8)。 在这种情况下如何删除它们? 你可以做一个export LC_ALL=C【参考方案3】:

我的解决方案使用grepsortuniq

grep -o . file | sort | uniq -c

忽略大小写:

grep -o . file | sort -f | uniq -ic

【讨论】:

在此之后如何获得频率/总和(所有频率)? @SkypeMeSM 获取每个字符的频率,只需除以字符总数(由wc -c file 给出)。【参考方案4】:

sedsortuniq 的解决方案:

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

【讨论】:

谢谢。这将大写和小写字符视为分开的。如何计算我们认为 A 和 a 相同的频率? 是的,这也很好用。我想知道如何计算概率,即频率/总和。我们需要再次将输出通过管道传递给 sed,但我无法弄清楚所涉及的正则表达式? 您可以添加一些wccutdctee 和其他命令,但与可维护的工作相比,它更像是在处理盘子。我认为使用 perl 脚本添加更多功能会更容易。 非常感谢您的帮助。干杯。【参考方案5】:

这是一个建议:

while read -n 1 c
do
    echo "$c"
done < "$INPUT_FILE" | grep '[[:alpha:]]' | sort | uniq -c | sort -nr

【讨论】:

以上是关于用于查找文件中每个字母的频率的 Bash 脚本的主要内容,如果未能解决你的问题,请参考以下文章

我如何将文本文件转换为小写并查找字母的频率?

Matlab:在一帧音频数据中查找主要频率

使用bash shell脚本从文件中查找和提取特定字符串后的值?

如何查找多个文件、检查重复文件并用 bash、sed 脚本替换

Bash:从脚本中查找并替换文本

Bash脚本 - 查找具有非零字节内容的目录