Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Bash脚本以查找文件中每个字母的频率_Linux_Bash_Frequency_Letters - Fatal编程技术网

Linux 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” 完成

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

以下是一个建议:

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