我有这个数组:
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次)。任何想法?
答案 0 :(得分:5)
dc <<<"$(printf '%d\n' "${array[@]}" | sort -n | uniq -c | tail -n 1) * p"
sort
最终获得最大值uniq -c
只获取唯一值,并显示它们出现的次数tail
仅获取最后一行(包含最大值及其计数)dc
将该值乘以计数我为乘法步骤选择了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)