arrays - 数组中出现频率最高的元素 (bash 3.2)

标签 arrays bash macos shell

在使用 bash 的 shell 脚本中,我想找到一个数组中出现次数最多的数字,并将结果存储在变量 $result 中。该数组可以有任意数量的值。如果返回多个结果,那么我想选择最小的数字。

我知道 bash 可能不是最好的工具,我愿意接受使用 Mac OS X 系统脚本中命令行可用工具的建议。

例子:

数组=(03 03 03 04 04 04 04)
03出现3次
04出现4次
应将 04 返回到名为 $result 的变量中。

另一个例子:

数组=(03 03 03 03 04 04 04 04)
03出现4次
04出现4次
选择最小的数字 03
应该将 03 返回到名为 $result 的变量中。

感谢您的帮助。

最佳答案

你的问题中有一个需要解决的歧义:你说数组是一个数字的数组,但是这个例子以前导零呈现它们,如果你将字符串视为数字(它们将以八进制解释)。

除此之外,解决方法比较简单:使用sortuniq统计每个值出现的次数,将结果按count排序,然后提取第一个值。为了满足排序的要求,我们首先使用 printf 每行写入一个元素的数组:

printf '%s\n' "${arr[@]}" | sort | uniq -c |
sort -k1,1nr -k2 | awk '{print $2; exit}'

sort 的两次调用都将原始数据排序为字符串。如果您真的想将它们排序为数字,您可以使用:

printf '%d\n' "${arr[@]}" | sort -n | uniq -c |
sort -k1,1nr -k2n | awk '{print $2; exit}'

尽管这会将所有数字规范化为规范形式(因此 03 将变为 3)。

关于arrays - 数组中出现频率最高的元素 (bash 3.2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43440425/

相关文章:

python - 如何在 OS X 上运行 Hadoop?

php - “pdo_mysql” 已禁用,我无法启用它。我在 iMac 7.1 OSX 10.6.8 上安装了 MAMP v. 3.0.4

javascript - 将大型 PHP 数组拆分为用于 javascript 的较小块

php - 如何将一个数组中的子数组同步嵌套到另一个数组的子数组中?

linux - 在 bash 中提取特定单词

macos - 如何获取 OS X 上进程的完整路径?

c - 如何在不使用 strcpy 的情况下将字符数组复制到 char 指针

python - Numpy python 中的数组索引

linux - 使用 While 和 IF 进行验证

bash - 使用特定符号之间匹配的 ID 字符串过滤多个 fasta 文件