如何统计Bash数组唯一值及元素出现频率?
嘿,我来帮你搞定Bash数组的这两个统计需求!下面分两种场景给你详细说明,附上手边就能用的代码示例。
一、统计数组中各元素的出现频率
最常用且高效的方法是借助printf、sort和uniq这几个工具组合,步骤很简单:
- 用
printf把数组的每个元素单独输出一行 - 用
sort把相同元素排到一起 - 用
uniq -c统计每行(也就是每个元素)的出现次数
举个例子,假设你的数组是:
sorted=(apple banana apple orange banana apple grape)
执行下面的命令就能得到频率统计:
printf "%s\n" "${sorted[@]}" | sort | uniq -c
输出结果会是:
3 apple 2 banana 1 grape 1 orange
如果觉得默认格式(次数在前、元素在后)不够直观,想改成元素: 次数的形式,可以再加个awk调整:
printf "%s\n" "${sorted[@]}" | sort | uniq -c | awk '{print $2 ": " $1}'
输出就会变成:
apple: 3 banana: 2 grape: 1 orange: 1
如果你不想依赖外部命令,想用纯Bash语法实现,那可以用关联数组(Bash 4及以上版本支持):
# 声明一个关联数组用来存频率 declare -A freq # 遍历数组,统计每个元素的出现次数 for item in "${sorted[@]}"; do ((freq[$item]++)) done # 遍历关联数组,输出每个元素和对应的频率 for key in "${!freq[@]}"; do echo "$key: ${freq[$key]}" done
这个方法全程用Bash内置功能处理,适合对性能有要求或者环境受限的场景。
二、统计数组中的唯一值数量
同样有两种常用方法:
方法1:基于频率统计的衍生
既然uniq会把重复元素合并成一行,那统计uniq后的行数就是唯一值的数量:
printf "%s\n" "${sorted[@]}" | sort | uniq | wc -l
用刚才的示例数组执行,会输出4,正好对应apple、banana、grape、orange这4个唯一值。
方法2:借助关联数组的特性
关联数组的键就是数组中的唯一元素,所以直接取关联数组的长度即可:
declare -A freq for item in "${sorted[@]}"; do ((freq[$item]++)) done # 输出唯一值数量 echo "数组中的唯一值数量:${#freq[@]}"
执行后会输出数组中的唯一值数量:4,和方法1结果一致。
内容的提问来源于stack exchange,提问作者user9487425
相关产品推荐
相关产品推荐

