readarray -t array < <(
for str in "${array[@]}"; do
printf '%d\t%s\n' "${#str}" "$str"
done | sort -k 1,1nr -k 2 | cut -f 2- )
프로세스 대체에서 정렬 된 배열의 값을 읽습니다.
프로세스 대체는 루프를 포함합니다. 루프는 요소의 길이와 그 사이에 탭 문자가 앞에 붙는 배열의 각 요소를 출력합니다.
루프의 출력 값에서 낮은 수치 정렬 (알파벳순 길이가 같은 경우, 사용되는 -k 2r
대신에, -k 2
알파벳 역순) 그리고 그 결과 그 로 전송 cut
되는 문자열 길이를 갖는 열을 삭제한다.
테스트 스크립트를 정렬 한 다음 테스트 실행을 정렬하십시오.
array=(
"tiny string"
"the longest string in the list"
"middle string"
"medium string"
"also a medium string"
"short string"
)
readarray -t array < <(
for str in "${array[@]}"; do
printf '%d\t%s\n' "${#str}" "$str"
done | sort -k 1,1nr -k 2 | cut -f 2- )
printf '%s\n' "${array[@]}"
$ bash script.sh
the longest string in the list
also a medium string
medium string
middle string
short string
tiny string
문자열에 줄 바꿈이 포함되어 있지 않다고 가정합니다. 최근의 GNU 시스템 bash
에서는 개행 문자 대신 레코드 구분 기호로 널 문자를 사용하여 데이터에 포함 된 개행 문자를 지원할 수 있습니다.
readarray -d '' -t array < <(
for str in "${array[@]}"; do
printf '%d\t%s\0' "${#str}" "$str"
done | sort -z -k 1,1nr -k 2 | cut -z -f 2- )
여기서, 데이터는 후단이 인쇄되어 \0
제 1, 대신 개행의 루프 sort
및 cut
그들의 NUL 통해 분리 된 라인을 판독 -z
GNU 옵션 및 readarray
최종적으로 NUL 구분 된 데이터를 판독한다 -d ''
.