bash脚本以找到文件中每个字母的频率
题
我试图找出输入文件中英语字母中每个字母的外观频率。我该如何在BASH脚本中执行此操作?
解决方案
只有一个尴尬命令
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]/
如果您不想显示Unicode,请执行 export LC_ALL=C
其他提示
我的解决方案使用 grep
, sort
和 uniq
.
grep -o . file | sort | uniq -c
忽略案例:
grep -o . file | sort -f | uniq -ic
解决方案 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
这是一个建议:
while read -n 1 c
do
echo "$c"
done < "$INPUT_FILE" | grep '[[:alpha:]]' | sort | uniq -c | sort -nr
类似于上面的Mouviciel的答案,但是BSD系统上使用的Bourne和Korn壳的通用性更高,当您没有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
不隶属于 StackOverflow