Se eu tiver uma string "1 2 3 2 1" - ou uma matriz [1,2,3,2,1] - como posso selecionar os valores exclusivos, ou seja,
"1 2 3 2 1" produces "1 2 3"
ou
[1,2,3,2,1] produces [1,2,3]
Semelhante ao uniq, mas o uniq parece funcionar em linhas inteiras, não em padrões dentro de uma linha ...
bash
array, acrescentou uma maneiraSe você estiver usando o zsh:
ou (se a
KSH_ARRAYS
opção não estiver definida)fonte
"${(u)array[@]}"
ou"${(@u)array}"
(observe as aspas).${(u)array}
funciona mesmo se a matriz estiver vazia ou contiver uma string vazia, sem aspas.Para uma matriz com valores arbitrários, é bastante complicado
bash
, pois não possui um operador interno para isso.bash
no entanto, não suporta o armazenamento de caracteres NUL em suas variáveis; portanto, você pode usá-lo para passar isso para outros comandos:O equivalente a
zsh
's:em um sistema GNU recente, pode ser:
Como alternativa, com versões recentes de
bash
, e assumindo que nenhum dos elementos da matriz está vazio, você pode usar matrizes associativas:Com o bash 4.4 e mais recente e com o GNU
sort
:A ordem dos elementos não seria a mesma nessas soluções diferentes.
Com
tcsh
:Reteria o f elemento irst (
a b a
=>a b
) comozsh
's(u)
flag expansão.Reteria o último (
a b a
=>b a
). Esses, no entanto, removem elementos vazios da matriz.fonte
Esta solução funcionou para mim.
O acima produz 1 2 3 como a saída.
A versão mais curta, conforme sugerido por Costas, pode ser,
Para armazenar os resultados finais em uma matriz, você pode fazer algo como,
Agora, quando eu faço um eco
arr
, essa é a saída que eu recebo.Referências
https://stackoverflow.com/a/13648438/1742825 https://stackoverflow.com/a/9449633/1742825
fonte
tr '\n' ' '
Para fazer isso inteiramente no shell e colocar o resultado em uma matriz,
Em palavras: se ainda não vimos uma palavra, adicione-a à
result
matriz e sinalize-a como tendo sido vista. Depois que uma palavra for vista, ignore as aparências subseqüentes.fonte
unset seen
antesdeclare -A seen
, caso$seen
tenha sido definido anteriormente (mesmo como uma variável escalar do ambiente).