获取bash数组中最常出现的数字
我需要找到数组中最频繁的数字。我是这样做的:获取bash数组中最常出现的数字,bash,Bash,我需要找到数组中最频繁的数字。我是这样做的: # our array, the most frequent value is 55 declare -a array=(44 55 55 55 66 66) # counting unque string with uniq and then sorting as numbers array=($(printf "%s\n" "${array[@]}"| uniq -c | sort -n -r)) # printing 2nd element
# our array, the most frequent value is 55
declare -a array=(44 55 55 55 66 66)
# counting unque string with uniq and then sorting as numbers
array=($(printf "%s\n" "${array[@]}"| uniq -c | sort -n -r))
# printing 2nd element of array, as the first one - number of occurencies
printf ${array[1]}
这是一种更好/更漂亮的方法,而不是构建一个由混合计数和数字组成的奇怪数组(第二步)
我的排序正确吗?(
uniq
返回两列中的值,因此我不确定它如何选择列)如果我必须在bash
中执行此操作,我将使用awk
跳过对任何内容的排序,只计算元素:
printf '%s\n' "${array[@]}" | awk '{
if (++arr[$0] > max) {
max=arr[$0];
ans=$0
}
}
END {print ans}'
您还可以在bash
4或更高版本中使用关联数组实现相同的算法:
# These don't strictly need to be initialized, but it's safer
# to ensure they don't already have values.
declare -A counts=()
max=0
ans=
for i in "${array[@]}"; do
if ((++counts[$i] > max)); then
max=${counts[$i]}
ans=$i
fi
done
printf '%s\n' "$ans"
如果您不想使用awk来执行此操作,您仍然可以使用sort和uniq来执行此操作,但要小心,您需要在计数之前对输入进行排序。否则它将无法工作。例如:
declare -a array=(34 3 45 45 66 55 44 55 55 55 66 45 45 8 6 45 45 66 32 9 18)
printf "%s\n" "${array[@]}" | sort -n -r | uniq -c | sort -n -r | head -1 | awk '{print $2}'
其中,对于给定的输入,代码正确地提取了重复次数最多的数字,但在您提供的示例中,它将不起作用,并且它将告诉您55是重复次数最多的数字,尽管这是错误的,因为它显然是45,但是uniq只计算连续项,如果它们稀疏,它将不正确地计算它们
雷加斯 在
bash
v4+forward上使用关联数组的切普纳逻辑的更详细版本。我们构建了关联数组hashMap
,其中key作为数组元素,其出现次数作为值。一旦我们构建了数组,我们就会从数组中找到最大计数并检索其值
#!/usr/bin/env bash
declare -a array=(44 55 55 55 66 66)
declare -A hashMap
declare -i max=0
for element in "${array[@]}"; do
((hashMap["$element"]++))
done
for key in "${!hashMap[@]}"; do
(( "${hashMap[$key]}" > max )) && { max="${hashMap[$key]}"; element="$key" ; }
done
printf '%d\n' "$element"
另一个极简主义者
awk
$ awk '{for(mi=i=1;i<=NF;i++) if(a[$mi]<++a[$i]) mi=i; print $mi}' <<< "${array[@]}"
$awk'{for(mi=i=1;iNote表示,uniq
需要对其输入进行排序,因此您可能需要在管道中的uniq
之前插入另一个对sort
的调用。实际上,如果输入是预排序的,这非常好。逻辑不会处理无序数据。请记住,bash
是一个shell,而不是真正的shell一种通用编程语言。它设计用于处理程序执行和所需的数据移动:命令参数、管道数据等@Prune我知道,只需要修改一些脚本,我不想用另一种语言重写它。实际上输入不需要排序,但重复的条目必须相邻