Создайте новый массив с уникальными значениями из существующего массива

Я пытаюсь создать новый массив переменных из уникальных значений, которые находятся в другом массиве, но я не получаю желаемого результата.

Исходный массив

[root@sup-jpc-west1 ~/tmp]# echo ${owner[*]} 390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb e14c2413-7179-44f8-dfc3-b8624dcb10bb 390920ad-2858-e651-a4af-a9eaa6acaebb e14c2413-7179-44f8-dfc3-b8624dcb10bb 390920ad-2858-e651-a4af-a9eaa6acaebb e14c2413-7179-44f8-dfc3-b8624dcb10bb 390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb e14c2413-7179-44f8-dfc3-b8624dcb10bb 390920ad-2858-e651-a4af-a9eaa6acaebb e14c2413-7179-44f8-dfc3-b8624dcb10bb 390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb 0a452389-5ed2-e46f-ad15-cc538c82650d 4232f23d-ed48-4b14-c0ea-aa911fd24920 8ee1b05f-2473-4c37-bfc5-ae393921b939 

Команда, которую я использую

 uniq=($(printf "%s\n" "${owner[@]}" | sort -u)) 

Проблема (она сохраняет все уникальные значения как одно значение под индексом 0)

 [root@sup-jpc-west1 ~/tmp]# echo ${uniq[0]} 0a452389-5ed2-e46f-ad15-cc538c82650d 390920ad-2858-e651-a4af-a9eaa6acaebb 4232f23d-ed48-4b14-c0ea-aa911fd24920 8ee1b05f-2473-4c37-bfc5-ae393921b939 e14c2413-7179-44f8-dfc3-b8624dcb10bb [root@sup-jpc-west1 ~/tmp]# echo ${uniq[1]} [root@sup-jpc-west1 ~/tmp]# 

Кто-нибудь знает лучший способ захватить уникальные значения из этого массива?

Использование bash на SmartOS (аналогично Solaris)

РЕДАКТИРОВАТЬ

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

 uniq=($(printf "%s " "${owner[@]}" | sort -u)) 

2 Solutions collect form web for “Создайте новый массив с уникальными значениями из существующего массива”

 uniq=($(printf "%s\n" "${owner[@]}" | sort -u | tr '\n' ' ')) 

Должен это делать.

Или, как отмечено в комментарии, измените свою IFS.

Ваше использование echo "${owner[*]}" делает эту длинную строку.

Вы должны были использовать printf '%s\n' "${owner[@]}" .

Если пробел (или новая строка) является разделителем строк, вставленных в ваш вопрос, мы можем восстановить исходный массив (копировать и вставлять из сообщения)

 $ owner=(390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb e14c2413-7179-44f8-dfc3-b8624dcb10bb 390920ad-2858-e651-a4af-a9eaa6acaebb e14c2413-7179-44f8-dfc3-b8624dcb10bb 390920ad-2858-e651-a4af-a9eaa6acaebb e14c2413-7179-44f8-dfc3-b8624dcb10bb 390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb e14c2413-7179-44f8-dfc3-b8624dcb10bb 390920ad-2858-e651-a4af-a9eaa6acaebb e14c2413-7179-44f8-dfc3-b8624dcb10bb 390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb 0a452389-5ed2-e46f-ad15-cc538c82650d 4232f23d-ed48-4b14-c0ea-aa911fd24920 8ee1b05f-2473-4c37-bfc5-ae393921b939) 

для печати:

 $ printf '%s\n' "${owner[@]}" 390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb e14c2413-7179-44f8-dfc3-b8624dcb10bb 390920ad-2858-e651-a4af-a9eaa6acaebb e14c2413-7179-44f8-dfc3-b8624dcb10bb 390920ad-2858-e651-a4af-a9eaa6acaebb e14c2413-7179-44f8-dfc3-b8624dcb10bb 390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb e14c2413-7179-44f8-dfc3-b8624dcb10bb 390920ad-2858-e651-a4af-a9eaa6acaebb e14c2413-7179-44f8-dfc3-b8624dcb10bb 390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb 0a452389-5ed2-e46f-ad15-cc538c82650d 4232f23d-ed48-4b14-c0ea-aa911fd24920 8ee1b05f-2473-4c37-bfc5-ae393921b939 

Затем фильтруйте их по мере необходимости:

 $ printf '%s\n' "${owner[@]}" | sort -u 0a452389-5ed2-e46f-ad15-cc538c82650d 390920ad-2858-e651-a4af-a9eaa6acaebb 4232f23d-ed48-4b14-c0ea-aa911fd24920 8ee1b05f-2473-4c37-bfc5-ae393921b939 e14c2413-7179-44f8-dfc3-b8624dcb10bb 

И чтобы получить массив значений в var uniq, выполните:

 $ uniq=( $(printf '%s\n' "${owner[@]}" | sort -u) ) 

Все это работает, потому что IFS по умолчанию.
Если IFS изменится, результат может также измениться.

  • Обработка значений массива в bash
  • Разбор строки с использованием функции bash
  • Почему мой массив bash всегда имеет длину 1, когда я разделяю?
  • Почему каждая переменная не инициализируется значением своего значения по умолчанию для объявления в Bash?
  • Ошибка при построении ассоциативного массива
  • Есть ли способ чтения последнего элемента массива с помощью bash?
  • Петля с двумя переменными в сценарии bash
  • Преобразовать массив в аргументы команды?
  • Добавление в массивы
  • Динамически создавать массив в bash с переменными как имя массива
  • Как проверить, находится ли элемент в массиве bash?
  • Linux и Unix - лучшая ОС в мире.