Как извлечь элементы из массива массивов?

В прошлом существовала OpenSolaris , версия Solaris с открытым исходным кодом от Sun Microsystems. После того, как Oracle купила Sun, они прекратили разработку OpenSolaris, поэтому энтузиасты разделили его на OpenIndiana и позже illumos . Вы можете проверить их

Однако, если вам не нужен исходный код, последняя официальная версия Solaris 11 по-прежнему бесплатна для «разработки, тестирования, прототипирования и демонстрации ваших приложений» как ] согласно лицензии . Oracle также предоставляет готовые -готовые виртуальные машины для использования

0
26.04.2021, 19:18
1 ответ

Не знаю, почему вы используете ассоциативные массивы вместо простых массивов, когда ваши ключи представляют собой последовательные десятичные числа, начинающиеся с единицы, но если я правильно понимаю, что вы хотите, вы можете:

for key in "${(nok@)arrCollection}"; do
  print -r - "Assoc $key: $arrCollection[$key]"
  printf ' "%s" => "%s"\n' "${(@kvP)arrCollection[$key]}"
done

Что на вашем образце должно давать что-то вроде:

Assoc 1: arrOne
 "3" => "Third"
 "4" => "Fourth"
 "1" => "First"
 "2" => "Second"
Assoc 2: arrTwo
 "3" => "Red"
 "4" => "Green"
 "5" => "Blue"
 "1" => "Purple"
 "2" => "Orange"
Assoc 3: arrThree
 "3" => "Planet"
 "4" => "Sun"
 "5" => "Moon"
 "6" => "Star"
 "1" => "First"
 "2" => "Red"

Или также сортировать членов каждой ассоциации по числам по ключам:

for key in "${(nok@)arrCollection}"; do
  print -r - "Assoc $key: $arrCollection[$key]"
  for assoc_key in "${(@knoP)arrCollection[$key]}"; do
    printf ' "%s" => "%s"\n' "$assoc_key" "${${(P)arrCollection[$key]}[$assoc_key]}"
  done
done

Что даст:

Assoc 1: arrOne
 "1" => "First"
 "2" => "Second"
 "3" => "Third"
 "4" => "Fourth"
Assoc 2: arrTwo
 "1" => "Purple"
 "2" => "Orange"
 "3" => "Red"
 "4" => "Green"
 "5" => "Blue"
Assoc 3: arrThree
 "1" => "First"
 "2" => "Red"
 "3" => "Planet"
 "4" => "Sun"
 "5" => "Moon"
 "6" => "Star"

Ключи выше сортируются с использованиемo(порядка )иn(числового)флага раскрытия параметров . При этом элементы сравниваются с использованием порядка сортировки локали, за исключением частей, состоящих из последовательностей десятичных цифр¹. Последовательность десятичных цифр интерпретируется как десятичное целое число и сравнивается численно.

Это похоже на то, что реализация GNU sortделает с опцией -V/ --version-sort.

Таким образом, foo2-3будет стоять перед foo10-3и перед foo2-10, например, но это нельзя использовать для чисел, отличных от целых положительных десятичных чисел.(-2также будет стоять перед -10и 2.3перед2.10).

Для сортировки с использованием других произвольных критериев, несмотря на то, что существуют запутанные способы сделать это встроенным способом в zsh,может быть проще прибегнуть к sort, если вы можете гарантировать, что элементы не содержат символов NL или NUL и не пусты.

Например, с GNUsort:

for key in ${(0)"$(print -rNC1 -- ${(k)arrCollection} | sort -zg)"}

Для численного перебора не -пустых ключей, но на этот раз с поддержкой всех видов числовых представлений (, включая 0x20, 1e -1, бесконечность, -20, 0x3.fp5... ).

Выше используются записи с разделителями NUL для передачи списка в sortи разделения его вывода, поэтому предполагается, что ключи не содержат символов NUL. Чтобы вместо этого использовать символы NL/LF, удалите -N, -zи измените (0)на (f).


¹ и NUL-символы, которые должны обрабатываться отдельно, так как стандартный API сравнения их подавляет.

2
28.04.2021, 22:50

Теги

Похожие вопросы