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

위의 마지막 항목을 제외하고 해시에 최소한 하나의 요소가 포함되어 있다고 가정합니다( 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

관련 정보