查找数组中的第二大值

k-a*_*a-v 3 bash bash-array

我有一个这样的数组:

array=(1 2 7 6)
Run Code Online (Sandbox Code Playgroud)

并想搜索第二大值,输出为

secondGreatest=6
Run Code Online (Sandbox Code Playgroud)

有没有办法在 bash 中做到这一点?

jes*_*e_b 5

printf '%s\n' "${array[@]}" | sort -n | tail -2 | head -1
Run Code Online (Sandbox Code Playgroud)

将数组的每个值打印在它自己的行上,对其进行排序,获取最后 2 个值,删除最后一个值

secondGreatest=$(printf '%s\n' "${array[@]}" | sort -n | tail -2 | head -1)
Run Code Online (Sandbox Code Playgroud)

将该值设置为secondGreatest变量。


格伦·杰克曼 (Glenn Jackman) 对我没有考虑过的重复数字提出了一个很好的观点。如果您只关心唯一值,则可以使用-u排序标志:

secondGreatest=$(printf '%s\n' "${array[@]}" | sort -nu | tail -2 | head -1)
Run Code Online (Sandbox Code Playgroud)

  • 如果您进行反向排序,您可以节省一个管道,以便答案始终排在第二位,例如 `printf '%s\n' "${array[@]}" | 排序 -rn | awk NR==2`(可能 `head` + `tail` 更有效)或(至少对于支持空分隔符的 GNU Coreutils)`printf '%s\0' "${array[@]} " | 排序-rzn | 剪切 -d '' -f2` (5认同)