从一个数组中排列一行的值

我有这个数组:

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)。 有任何想法吗?

使用awk:

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

使用排序,数字以反向(-r)顺序排序(-n),并且awk继续总结数字,直到找到与前一个不同的数字。

 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输出并在其中间插入任何东西 – 只需添加内容即可。

你可以用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

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

只使用bash:

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

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