You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计Bash数组唯一值及元素出现频率?

嘿,我来帮你搞定Bash数组的这两个统计需求!下面分两种场景给你详细说明,附上手边就能用的代码示例。

一、统计数组中各元素的出现频率

最常用且高效的方法是借助printf、sort和uniq这几个工具组合,步骤很简单:

  1. 用printf把数组的每个元素单独输出一行
  2. 用sort把相同元素排到一起
  3. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:15:00