Печатать файлы в обратном порядке из ассоциативного массива в bash

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

Я объявляю current_file, как показано ниже в bash:

 declare -A current_file 

введите ключ как файл и размер как значение в current_file. Выходные данные для печати цикла:

 file2 file1 

Я хочу напечатать как:

 file1 file2 

Как я могу напечатать вот так?

2 Solutions collect form web for “Печатать файлы в обратном порядке из ассоциативного массива в bash”

Чтобы распечатать список ключей, отсортированных в алфавитном порядке, и при выборе sort GNU, вы можете сделать следующее:

 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[@]} unquoted имеет мало смысла, так как это вызывает оператор split + glob в этом списке ключей.

Ассоциативный массив в 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 
  • Удаление дубликатов в большом текстовом списке
  • Почему файловая система unix не сохраняет время создания файла?
  • Как сравнить размеры файлов в двух каталогах?
  • Запись в файл в определенном месте
  • член группы не может записать файл с возможностью записи в группу с помощью reiserfs и расширенных списков ACL
  • Как я могу подсчитать количество разных символов в файле?
  • Удалите все файлы, к которым не существует соответствующий файл с другим расширением.
  • Как найти файл, соответствующий трубе, открытому процессом?
  • Как назвать объем в Linux, чтобы я мог распознавать каждый том в файловой системе?
  • Почему в директориях / dev для каталогов, например pts?
  • Предотвратите случайное удаление файла
  • Linux и Unix - лучшая ОС в мире.