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

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

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

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'

관련 정보