我有这个数组:
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"
sort
以获得最大值 uniq -c
只能得到唯一的值,并计算它们出现的次数 tail
只得到最后一行(最大值和计数) 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// /+}))
用加号替换所有空格,并使用双括号表达式进行评估。