我需要帮助在bash中获取随机生成数字的模式。我不知道从哪里开始,有什么帮助吗?
即[1,2,3,3,4]模式为3。
谢谢。
答案 0 :(得分:1)
这样可行(通过用于生成数字的任何方法替换第一个管道之前的位)
echo 1 2 3 3 4 | xargs printf "%s\n" | sort | uniq --count | sort | tail -n1 | awk '{ print $2 }'
如果您想知道它的工作原理,请尝试一次添加一个阶段。
echo 1 2 3 3 4 | xargs printf "%s\n"
echo 1 2 3 3 4 | xargs printf "%s\n" | sort
echo 1 2 3 3 4 | xargs printf "%s\n" | sort | uniq --count
....
如果有平局,你只会得到两个答案中的一个(我猜的更高),如果其中一个有超过9个,你也可能得到错误答案,但这是一个开始。
答案 1 :(得分:0)
你实际上可以使用一个简短的bash函数来执行它,该函数将stdin
读入一个索引数组,用于将数字传递给sort
,然后一个循环将填充一个频率数组 arr
,其中包含每个数字的出现频率,同时跟踪最大出现次数。然后它只输出读取数字集的模式,例如
#!/bin/bash
getmode () {
mapfile input ## stdin into array
local -a arr ## declare frequency array
## pipe sorted array to loop to capture frequency of each number
printf "%s\n" ${input[@]} | sort -n |
{
mode=
max=0
while read -r n; do
arr[$n]=$((${arr[n]}+1)) ## increment index at number
## check if arr[n] is most frequent
[ "${arr[n]}" -gt "$max" ] &&
{
max="${arr[n]}"
mode=$n
}
done
echo "mode $mode" ## output the mode
}
}
echo $@ | getmode
(注意:如果有两个(或更多)值具有相等的最大值,则需要确定如何处理模式 - 目前它将采用多个相等最大值中的第一个)< / p>
示例使用/输出
$ bash findmode.sh 1 2 3 3 4
mode 3
或更长的未排序集:
$ bash findmode.sh 1 8 3 1 5 2 7 5 3 9 5 1 6 5
mode 5