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

@barun Да, именно так, хотя я не знал, что термин «декартово произведение» - это термин для его описания. Я провел небольшое исследование с этой информацией и пришел к следующему:

while read line1
do
    while read line2
    do psql -d task_hst -A -P tuples_only=on -c "select f_path, file_name from $line1 where file_name = '$line2'"|sed 's/|/\//g' >> $OUT
    done < $2
done < $1

Похоже, это действительно выполняет свою работу. Благодарю за ваш ответ! Есть ли лучший способ сделать это?

1
13.02.2019, 16:14
2 ответа
uniq=($(printf "%s\n" "${owner[@]}" | sort -u | tr '\n' ' '))

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

Или, как указано в комментарии, измените файл IFS.

4
27.01.2020, 23:33

Использование вами 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 изменится, результат также может измениться.

2
27.01.2020, 23:33

Теги

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