【发布时间】:2011-04-27 09:06:30
【问题描述】:
我试图找出输入文件中英文字母表中每个字母的出现频率。如何在 bash 脚本中执行此操作?
【问题讨论】:
-
你为什么要为此使用 bash?
-
在某处发现了这个编程问题!!我想 perl 会是更好的选择,不是吗?
标签: linux bash frequency letters
我试图找出输入文件中英文字母表中每个字母的出现频率。如何在 bash 脚本中执行此操作?
【问题讨论】:
标签: linux bash frequency letters
与上述 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
【讨论】:
只有一个 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]/
如果您不想显示 unicode,请使用 export LC_ALL=C
【讨论】:
export LC_ALL=C。
我的解决方案使用grep、sort 和uniq。
grep -o . file | sort | uniq -c
忽略大小写:
grep -o . file | sort -f | uniq -ic
【讨论】:
wc -c file 给出)。
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
【讨论】:
wc、cut、dc、tee 和其他命令,但与可维护的工作相比,它更像是在处理盘子。我认为使用 perl 脚本添加更多功能会更容易。
这是一个建议:
while read -n 1 c
do
echo "$c"
done < "$INPUT_FILE" | grep '[[:alpha:]]' | sort | uniq -c | sort -nr
【讨论】: