다음과 같은 배열이 있습니다.
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'