来自一行中数组的Bash-sum值

时间:2012-12-03 11:35:40

标签: linux bash sum

我有这个数组:

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 个答案:

答案 0 :(得分:5)

dc <<<"$(printf '%d\n' "${array[@]}" | sort -n | uniq -c  | tail -n 1) * p"
  1. sort最终获得最大值
  2. uniq -c只获取唯一值,并显示它们出现的次数
  3. tail仅获取最后一行(包含最大值及其计数)
  4. dc将该值乘以计数
  5. 我为乘法步骤选择了dc,因为它是RPN,因此您不必拆分uniq -c输出并在其中间插入任何内容 - 只需添加内容即可。

答案 1 :(得分: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保持对数字求和,直到找到与前一个数字不同的数字。

答案 2 :(得分: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,允许您将字符串(在本例中为数组的所有元素)作为stdin提供给awk

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

答案 3 :(得分:-1)

仅使用bash:

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

Replace所有带加号的空格,并使用double-parentheses表达式进行评估。