배열에서 두 번째로 큰 값 찾기

배열에서 두 번째로 큰 값 찾기

다음과 같은 배열이 있습니다.

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에 직면하여 엄격히 작은 두 번째로 큰 값을 선택하는 추가 이점이 있습니다 .77

답변3

dc에게는 좋은 일입니다.

array=(1 2 7 6)
echo ${array[*]} | dc -f - -e '
  [lasbdsa]sB
  [dla!>Bsc1z>A]sA
  lAx
  [secondGreatest=]nlbp'

관련 정보