1

我有这个数组:

array=(1 2 3 4 4 3 4 3)

我可以通过以下方式获得最大的数字:

echo "num: $(printf "%d\n" ${array[@]} | sort -nr | head -n 1)"
#outputs 4

但我想把所有 4 的加起来,这意味着我希望它输出 12(有 3 次出现 4)。有任何想法吗?

4

4 回答 4

5
dc <<<"$(printf '%d\n' "${array[@]}" | sort -n | uniq -c  | tail -n 1) * p"
  1. sort最后获得最大值
  2. uniq -c仅获取唯一值,并计算它们出现的次数
  3. tail仅获取最后一行(具有最大值及其计数)
  4. dc将值乘以计数

我选择dc乘法步骤是因为它是 RPN,因此您不必拆分uniq -c输出并在其中插入任何内容 - 只需将内容添加到末尾即可。

于 2012-12-03T11:59:18.660 回答
3

使用 awk:

$ printf "%d\n" "${array[@]}" | sort -nr | awk 'NR>1 && p!=$0{print x;exit;}{x+=$0;p=$0;}'
12

使用 sort,数字以反向(-r)顺序排序(-n),并且 awk 不断对数字求和,直到找到一个与前一个不同的数字。

于 2012-12-03T12:00:07.517 回答
2

你可以这样做awk

awk -v RS=" " '{sum[$0]+=$0; if($0>max) max=$0} END{print sum[max]}' <<<"${array[@]}"

RS(记录分隔符)设置为空格允许您将数组条目作为单独的记录读取。

sum[$0]+=$0;均值sum是每个输入值的累积和的映射;if($0>max) max=$0计算到目前为止看到的最大数量;END{print sum[max]}打印最后看到的大数的总和。

<<<"${array[@]}"是一个 here-document,允许您将字符串(在本例中为数组的所有元素)作为标准输入提供给awk.

这种方式不涉及管道或循环 - 一个命令完成所有工作。

于 2012-12-03T11:55:55.763 回答
-1

仅使用 bash:

echo $((${array// /+}))

用加号替换所有空格,并使用双括号表达式进行评估。

于 2014-11-26T08:46:01.847 回答