我有这个数组:
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)。有任何想法吗?
dc <<<"$(printf '%d\n' "${array[@]}" | sort -n | uniq -c | tail -n 1) * p"
sort
最后获得最大值uniq -c
仅获取唯一值,并计算它们出现的次数tail
仅获取最后一行(具有最大值及其计数)dc
将值乘以计数我选择dc
乘法步骤是因为它是 RPN,因此您不必拆分uniq -c
输出并在其中插入任何内容 - 只需将内容添加到末尾即可。
使用 awk:
$ printf "%d\n" "${array[@]}" | sort -nr | awk 'NR>1 && p!=$0{print x;exit;}{x+=$0;p=$0;}'
12
使用 sort,数字以反向(-r)顺序排序(-n),并且 awk 不断对数字求和,直到找到一个与前一个不同的数字。
你可以这样做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
.
这种方式不涉及管道或循环 - 一个命令完成所有工作。