Crie uma nova matriz com valores exclusivos da matriz existente [duplicada]

1

Estou tentando criar uma nova matriz de variáveis a partir dos valores exclusivos que estão em outra matriz, mas não estou obtendo o resultado desejado.

Matriz original

[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

Comando que estou usando

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

Problema (está armazenando todos os valores exclusivos como um único valor no índice 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]#

Alguém conhece uma maneira melhor de pegar os valores únicos dessa matriz?

Usando o bash no SmartOS (semelhante ao Solaris)

EDITAR

Eu também tentei o seguinte, que armazenará cada valor sob seu próprio número de índice, mas não removerá os valores duplicados:

uniq=($(printf "%s " "${owner[@]}" | sort -u))
    
por Jesse_b 11.07.2017 / 23:30

2 respostas

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

Deve fazer isso.

Ou, conforme observado em um comentário, modifique seu IFS.

    
por 11.07.2017 / 23:56
1

Seu uso de um echo "${owner[*]}" torna essa uma cadeia longa.

Você deveria ter usado printf '%s\n' "${owner[@]}" .

Se um espaço (ou uma nova linha) for o delimitador das strings que você colou em sua pergunta, podemos recuperar a matriz original com (copiar e colar da postagem)

$ 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)

para poder imprimir:

$  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

E, depois, filtre-os conforme necessário:

$ 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

E para obter uma matriz de valores no var uniq, faça:

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

Todos os trabalhos acima porque o IFS padrão é.
Se o IFS mudar, o resultado também poderá mudar.

    
por 11.07.2017 / 23:58

Tags