Bash의 연관 배열에서 역순으로 파일 인쇄

Bash의 연관 배열에서 역순으로 파일 인쇄
for key in ${!current_file[@]} 
    do
      echo $key      
     done

bash에서 current_file을 다음과 같이 선언합니다.

declare -A current_file

current_file에 키를 파일로, 크기를 값으로 삽입합니다. for 루프에 의해 인쇄된 출력:

file2
file1

다음과 같이 인쇄하고 싶습니다.

file1 
file2

어떻게 하면 이렇게 인쇄할 수 있나요?

답변1

GNU 를 가정하여 키의 알파벳순 목록을 인쇄하려면 sort다음을 수행할 수 있습니다.

printf '%s\0' "${!hash[@]}" | sort -z | tr '\0' '\n'

또는 정렬된 키 목록을 반복합니다.

while IFS= read -rd '' -u3 key; do
  something with "${hash[$key]}"
done 3< <(printf '%s\0' "${!hash[@]}" | sort -z)

키에 개행 문자가 포함되지 않는다고 보장할 수 있다면 다음과 같이 단순화할 수 있습니다.

printf '%s\n' "${!hash[@]}" | sort

그래 zsh그거야:

printf "%s\n" "${(ko@)hash}"

( k키를 가져오고, o목록을 정렬하고, @큰따옴표 안에 빈 키가 있으면 유지합니다( bash현재는 빈 키가 있는 해시 요소를 가질 수 없다는 제한이 있습니다).

그리고 그것들을 반복합니다:

for key in "${(ko@)hash}"; do
  something with "$hash[$key]"
done

위의 마지막 항목을 제외하고 해시에 최소한 하나의 요소가 포함되어 있다고 가정합니다( 아무 인수 도 null 키가 있는 요소가 있는 것처럼 printf '%s\0'출력되지 않으므로 ).\0

어쨌든 따옴표 없이 작성하는 것은 거의 의미가 없습니다 ${!current_file[@]}. 왜냐하면 해당 키 목록에서 분할+글로브 연산자를 호출하기 때문입니다.

답변2

연관 배열은 bash일반적인 언어의 해시/사전과 유사하며 순서가 없습니다(실제로는 내부 해시 값을 기준으로 순서가 지정됨). 따라서 (연관) 배열 키를 반복할 때 출력이 (일반적으로) 정렬될 것이라고 기대할 수 없습니다.

예를 들어 다음과 같이 STDOUT을 STDIN으로 보내십시오 sort.

for key in ${!current_file[@]}; do
    echo $key      
done | sort 

또는 그런 것.


연관 배열 키/값에 대해 순서 기반 작업을 수행할 수 있도록 순서를 유지하려면 다른 인덱스 배열을 삽입에 대한 참조로 유지할 수 있습니다. 다음은 기본적인 아이디어를 제공합니다.

## Associative array `foo`
$ declare -A foo=([spam]=egg [baz]=cool)

## Reference indexed array `bar` containing the keys of `foo` sequentially indexed
$ bar=(spam baz)

## Retrieving in forward order
$ for i in "${bar[@]}"; do echo "$i :: ${foo[$i]}"; done
spam :: egg
baz :: cool

## Retrieving in reverse order
$ for ((i=${#bar[@]}-1; i>=0; i--)); do idx="${bar[$i]}"; echo "$idx :: ${foo[$idx]}"; done
baz :: cool
spam :: egg

관련 정보