Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取bash数组中最常出现的数字_Bash - Fatal编程技术网

获取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来执行此操作,您仍然可以使用sortuniq来执行此操作,但要小心,您需要在计数之前对输入进行排序。否则它将无法工作。例如:

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我知道,只需要修改一些脚本,我不想用另一种语言重写它。实际上输入不需要排序,但重复的条目必须相邻