
다음과 같은 배열이 있습니다.
array=(1 2 7 6)
두 번째로 큰 값을 검색하고 싶습니다. 출력은 다음과 같습니다.
secondGreatest=6
Bash에서 이를 수행할 수 있는 방법이 있습니까?
답변1
printf '%s\n' "${array[@]}" | sort -n | tail -2 | head -1
배열의 각 값을 해당 줄에 인쇄하고, 정렬하고, 마지막 2개 값을 가져오고, 마지막 값을 제거합니다.
secondGreatest=$(printf '%s\n' "${array[@]}" | sort -n | tail -2 | head -1)
해당 값을 변수로 설정하십시오 secondGreatest
.
글렌 잭맨(Glenn Jackman)은 내가 고려하지 않은 중복 숫자에 대해 훌륭한 지적을 했습니다. 고유한 값에만 관심이 있는 경우 -u
정렬 플래그를 사용할 수 있습니다.
secondGreatest=$(printf '%s\n' "${array[@]}" | sort -nu | tail -2 | head -1)
답변2
배열을 통한 bash 특정 루프가 이를 수행할 수 있습니다. 가장 큰 것과 두 번째로 큰 것을 추적해야 합니다. 또 다른 까다로운 부분은 해당 값을 초기화할 때 주의하는 것입니다. 가장 큰 값은 첫 번째 요소로 초기화됩니다. 두 번째로 큰 값은 가장 큰 값보다 작은 값을 처음 볼 때 초기화됩니다. 두 번째로 큰 값에 대해서는 현재 가장 큰 값보다 엄격히 작은 경우에만 업데이트합니다.
#!/bin/bash
array=(7 7 6 2 1)
if [ "${#array[@]}" -lt 2 ]
then
echo Incoming array is not large enough >&2
exit 1
fi
largest=${array[0]}
secondGreatest='unset'
for((i=1; i < ${#array[@]}; i++))
do
if [[ ${array[i]} > $largest ]]
then
secondGreatest=$largest
largest=${array[i]}
elif (( ${array[i]} != $largest )) && { [[ "$secondGreatest" = "unset" ]] || [[ ${array[i]} > $secondGreatest ]]; }
then
secondGreatest=${array[i]}
fi
done
echo "secondGreatest = $secondGreatest"
을 호출하는 것보다 여전히 느리지만 여러 개의 높은 값(예: 및 그 이상) sort
에 직면하여 엄격히 작은 두 번째로 큰 값을 선택하는 추가 이점이 있습니다 .7
7
답변3
dc에게는 좋은 일입니다.
array=(1 2 7 6)
echo ${array[*]} | dc -f - -e '
[lasbdsa]sB
[dla!>Bsc1z>A]sA
lAx
[secondGreatest=]nlbp'