Si j'ai une chaîne "1 2 3 2 1" - ou un tableau [1,2,3,2,1] - comment puis-je sélectionner les valeurs uniques, c'est-à-dire
"1 2 3 2 1" produces "1 2 3"
ou
[1,2,3,2,1] produces [1,2,3]
Similaire à uniq mais uniq semble fonctionner sur des lignes entières, pas sur des motifs au sein d'une ligne ...
bash
tableau, a ajouté un moyenSi vous utilisez zsh:
ou (si l'
KSH_ARRAYS
option n'est pas définie) mêmela source
"${(u)array[@]}"
ou à la"${(@u)array}"
place (notez les guillemets).${(u)array}
fonctionne même si le tableau est vide ou contient une chaîne vide, sans guillemets.Pour un tableau avec des valeurs arbitraires, c'est assez délicat
bash
car il n'a pas d'opérateur intégré pour cela.bash
Cependant, il ne prend pas en charge le stockage de caractères NUL dans ses variables, vous pouvez donc vous en servir pour passer cela à d'autres commandes:L'équivalent de
zsh
's:sur un système GNU récent, pourrait être:
Alternativement, avec des versions récentes de
bash
, et en supposant qu'aucun des éléments du tableau n'est vide, vous pouvez utiliser des tableaux associatifs:Avec bash 4.4 et plus récent et avec GNU
sort
:L'ordre des éléments ne serait pas le même dans ces différentes solutions.
Avec
tcsh
:Conserverait le f élément irst (
a b a
=>a b
) commezsh
des »(u)
drapeau d'extension.Conserverait le dernier (
a b a
=>b a
). Cependant, ceux-ci suppriment les éléments vides du tableau.la source
Cette solution a fonctionné pour moi.
Ce qui précède produit 1 2 3 comme sortie.
La version plus courte suggérée par Costas pourrait être,
Pour stocker les résultats finaux dans un tableau, vous pouvez faire quelque chose comme,
Maintenant, quand je fais un écho
arr
, c'est la sortie que j'obtiens.Références
https://stackoverflow.com/a/13648438/1742825 https://stackoverflow.com/a/9449633/1742825
la source
tr '\n' ' '
Pour le faire entièrement dans le shell et mettre le résultat dans un tableau,
En mots: si nous n'avons pas encore vu un mot donné, ajoutez-le au
result
tableau et marquez-le comme ayant été vu. Une fois qu'un mot a été vu, ignorez ses apparitions ultérieures.la source
unset seen
avantdeclare -A seen
dans le cas où a$seen
été précédemment défini (même en tant que variable scalaire de l'environnement).