Linux Bash脚本以查找文件中每个字母的频率
我试图找出输入文件中英文字母表中每个字母出现的频率。如何在bash脚本中执行此操作?以下是一个建议:Linux Bash脚本以查找文件中每个字母的频率,linux,bash,frequency,letters,Linux,Bash,Frequency,Letters,我试图找出输入文件中英文字母表中每个字母出现的频率。如何在bash脚本中执行此操作?以下是一个建议: while read -n 1 c do echo "$c" done < "$INPUT_FILE" | grep '[[:alpha:]]' | sort | uniq -c | sort -nr 读取时-n 1 c 做 回音“$c” 完成
while read -n 1 c
do
echo "$c"
done < "$INPUT_FILE" | grep '[[:alpha:]]' | sort | uniq -c | sort -nr
读取时-n 1 c
做
回音“$c”
完成<“$INPUT_文件”| grep'[:alpha:]'| sort | uniq-c | sort-nr
只需一个awk命令
awk -vFS="" '{for(i=1;i<=NF;i++)w[$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
awk-vFS=“”{对于(i=1;i具有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
我的解决方案使用grep
、sort
和uniq
grep -o . file | sort | uniq -c
忽略案例:
grep -o . file | sort -f | uniq -ic
与上面mouviciel的回答类似,但对于BSD系统上使用的Bourne和Korn Shell更为通用,当您没有GNU sed(在替换中支持)时,您可以反斜杠转义换行:
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
谢谢。这把大写字母和小写字母看成是分开的。我如何计算我们认为A和A相同的频率?是的,这也很好。我想知道如何计算概率,即频率/总和。我们需要再次将输出管再次输出到SeD,但是我不能计算出包含的正则表达式吗?添加一些wc
、cut
、dc
、tee
和其他命令,但与可维护的工作相比,添加更多功能更容易。我认为使用perl脚本添加更多功能会更容易。非常感谢您的帮助。干杯。您为什么要使用bash来完成此任务?发现了这个编程问题omewhere!!我想perl会是更好的选择,不是吗?很抱歉我对awk不是很熟悉。解决方案可行,但我得到的是所有字符,而不仅仅是字母数字字符。awk-vFS=“”{for(I=1;iThanks)。我想知道当正则表达式为[a-zA-Z]时,为什么我会得到像ü2和é2这样的结果。这是因为gawk的正则表达式适用于unicode字符。(UTF8)。在这种情况下,我如何删除它们?您可以执行导出LC_ALL=C
。在此之后,我如何获得频率/总和(所有频率)?@SkypeMeSM要获得每个字符的频率,只需除以字符总数(由wc-C文件
给出)。
sed -e's/./&\^J/g' file | sort | uniq -c | sort -nr