2011-11-21 2 views
16

내가 얻을 다음과 같은 출력 :배쉬 연관 배열

:

for k in "${!authors[@]}" 
do 
    echo $k ' - ' ${authors["$k"]} 
done 

내가 원하는 건이 같은 출력을 얻을 수 있습니다 : 다음 스크립트의 결과는

Pushkin - 100500 
Gogol - 23 
Dostoyevsky - 9999 

Pushkin - 100500 
Dostoyevsky - 9999 
Gogol - 23 

이는 연관 배열의 키가 값순으로 정렬되어야 함을 의미합니다. 그렇게 쉬운 방법이 있습니까?

답변

17

당신은 쉽게 3 필드의 숫자 내림차순으로, 당신의 출력을 정렬 할 수 있습니다

for k in "${!authors[@]}" 
do 
    echo $k ' - ' ${authors["$k"]} 
done | 
sort -rn -k3 

(1) sort 명령에 대한 자세한위한 일종의 참조하십시오. 이것은 출력 라인을 정렬합니다. bash에서 직접 배열을 정렬하는 방법을 모르겠습니다.

위의 내용이 배열 키와 같은 이름 ("Pushkin"외)을 어떻게 줄 수 있는지도 알 수 없습니다. bash에서는 배열 키가 항상 정수입니다.

+6

배시 4.0 키 문자열 일 수 연관 배열을 추가한다. –

+2

그럼 내가 ... 네 말이 맞을거야. 단지 '선언하다 - 저자'가 필요합니다. –

+1

솔루션이 작동합니다. 필자가 이해하는 한, 연관 배열의 내용이 아닌 출력 문자열을 정렬합니다. 그러나 어쨌든 생성 된 출력은 필요한 것입니다. – Graf

7

또는 당신이 인덱스를 정렬하고 배열을 루프 인덱스의 정렬 된 목록을 사용할 수 있습니다

authors_indexes=(${!authors[@]}) 
IFS=$'\n' authors_sorted=($(echo -e "${authors_indexes[@]/%/\n}" | sed -r -e 's/^ *//' -e '/^$/d' | sort)) 

for k in "${authors_sorted[@]}"; do 
    echo $k ' - ' ${authors["$k"]} 
done 
+0

부끄러워, 다시 :'echo -e'. 'printf'% s \ n ' "$ {authors_indexes [@]}"'를 사용하여 배열을 확장하여 POSIX sh의 위반에 의존하지 않는 방식으로 여러 행으로 확장하십시오 (확장이 아닌 실제 위반 : 모든 인수 역 슬래시가 있거나'-n'이 존재하지 않는 한,'-n' 이외의 문자는 텍스트를 인쇄해야합니다.이 경우 동작은 완전히 구현 정의입니다. 또는 printf '% s \ 0' "$ {array [@]}"'배열을 NUL- 구분 문자열로 확장하여 키에 리터럴 개행 문자가있는 경우에도 작동합니다). –

+0

... http://pubs.opengroup.org/onlinepubs/009695399/utilities/echo.html을 참조하십시오. 특히 APPLICATION USAGE 섹션을 참조하십시오. –

2

글로벌 정렬 옵션으로 -rn 사용 @AndrewSchulman에서 답을 확장은 모든 열을 반전시킵니다. 이 예에서 동일한 연관 배열 값을 가진 작성자는 이름의 역순으로 출력됩니다. 예컨대 특정 열을 정렬

declare -A authors 
authors=([Pushkin]=10050 [Gogol]=23 [Dostoyevsky]=9999 [Tolstoy]=23) 

for k in "${!authors[@]}" 
do 
    echo $k ' - ' ${authors["$k"]} 
done | sort -rn -k3 

가 출력

 
Pushkin - 10050 
Dostoyevsky - 9999 
Tolstoy - 23 
Gogol - 23 
옵션 용

열 지정자 후에 제공 될 수있다. 즉 sort -k3rn

키는 스팬으로 지정할 수 있습니다. 여기서 -k3은 최종 범위이기 때문에 발생하지만, 명시 적으로 3 열만 사용하려면 (추가 열이 추가 된 경우) -k3,3, 으로 지정해야합니다. 내림차순으로 열 3을 정렬 한 다음 열 (아마 무엇하는 것은 본 실시 예에서 요구된다) 오름차순 하나

declare -A authors 
authors=([Pushkin]=10050 [Gogol]=23 [Dostoyevsky]=9999 [Tolstoy]=23) 
for k in "${!authors[@]}" 
do 
    echo $k ' - ' ${authors["$k"]} 
done | sort -k3,3rn -k1,1 

가 출력

 
Pushkin - 10050 
Dostoyevsky - 9999 
Gogol - 23 
Tolstoy - 23