Si tengo una cadena "1 2 3 2 1", o una matriz [1,2,3,2,1], ¿cómo puedo seleccionar los valores únicos?
"1 2 3 2 1" produces "1 2 3"
o
[1,2,3,2,1] produces [1,2,3]
Similar a uniq pero uniq parece funcionar en líneas enteras, no en patrones dentro de una línea ...
bash
matriz, agregó una formaSi está usando zsh:
o (si la
KSH_ARRAYS
opción no está configurada) inclusofuente
"${(u)array[@]}"
o en su"${(@u)array}"
lugar (tenga en cuenta las citas).${(u)array}
funciona incluso si la matriz está vacía o contiene una cadena vacía, sin comillas.Para una matriz con valores arbitrarios, es bastante complicado
bash
ya que no tiene un operador incorporado para eso.bash
sin embargo, no admite el almacenamiento de caracteres NUL en sus variables, por lo que puede hacer uso de eso para pasar eso a otros comandos:El equivalente de
zsh
's:en un sistema GNU reciente, podría ser:
Alternativamente, con versiones recientes de
bash
, y suponiendo que ninguno de los elementos de la matriz esté vacío, podría usar matrices asociativas:Con bash 4.4 y más reciente y con GNU
sort
:El orden de los elementos no sería el mismo en esas diferentes soluciones.
Con
tcsh
:Conservaría la f elemento rimero (
a b a
=>a b
) comozsh
's(u)
bandera de expansión.Retendría el último (
a b a
=>b a
). Sin embargo, esos eliminan elementos vacíos de la matriz.fuente
Esta solución funcionó para mí.
Lo anterior produce 1 2 3 como salida.
La versión más corta como lo sugiere Costas podría ser,
Para almacenar los resultados finales en una matriz, puede hacer algo como,
Ahora, cuando hago un eco
arr
, esta es la salida que obtengo.Referencias
https://stackoverflow.com/a/13648438/1742825 https://stackoverflow.com/a/9449633/1742825
fuente
tr '\n' ' '
Para hacerlo completamente en el shell y poner el resultado en una matriz,
En palabras: si aún no hemos visto una palabra determinada, agréguela a la
result
matriz y márquela como si se hubiera visto. Una vez que se ha visto una palabra, ignore las apariencias posteriores de la misma.fuente
unset seen
antesdeclare -A seen
en caso de que$seen
se haya definido previamente (incluso como una variable escalar del entorno).