在使用 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 的变量中。
感谢您的帮助。
最佳答案
你的问题中有一个需要解决的歧义:你说数组是一个数字的数组,但是这个例子以前导零呈现它们,如果你将字符串视为数字(它们将以八进制解释)。
除此之外,解决方法比较简单:使用sort
和uniq
统计每个值出现的次数,将结果按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/