Si vous utilisez Bash version 4 ou supérieure (ce qui devrait être le cas dans toute version moderne de Linux), vous pouvez obtenir des valeurs de tableau uniques dans bash en créant un nouveau tableau associatif qui contient chacune des valeurs du tableau d'origine. Quelque chose comme ceci :
$ a=(aa ac aa ad "ac ad")
$ declare -A b
$ for i in "${a[@]}"; do b["$i"]=1; done
$ printf '%s\n' "${!b[@]}"
ac ad
ac
aa
ad
Cela fonctionne parce que dans tout tableau (associatif ou traditionnel, dans n'importe quel langage), chaque clé ne peut apparaître qu'une seule fois. Lorsque la clé for
La boucle arrive à la deuxième valeur de aa
sur a[2]
il écrase b[aa]
qui était initialement prévu pour a[0]
.
Faire des choses en bash natif peut être plus rapide que d'utiliser des pipes et des outils externes comme sort
y uniq
Cependant, pour les grands ensembles de données, vous obtiendrez probablement de meilleures performances si vous utilisez un langage plus puissant comme awk, python, etc.
Si vous vous sentez en confiance, vous pouvez éviter les for
en utilisant printf
La capacité de l'entreprise à recycler son format pour de multiples arguments, bien que cela semble nécessiter eval
. (Arrêtez de lire maintenant si vous êtes d'accord avec ça).
$ eval b=( $(printf ' ["%s"]=1' "${a[@]}") )
$ declare -p b
declare -A b=(["ac ad"]="1" [ac]="1" [aa]="1" [ad]="1" )
La raison pour laquelle cette solution nécessite eval
est que les valeurs des tableaux sont déterminées avant le découpage des mots. Cela signifie que la sortie de la commande substitution est considérée comme un seul mot plutôt qu'un ensemble de paires clé=valeur.
Bien qu'elle utilise un sous-shell, elle n'utilise que des builtins bash pour traiter les valeurs du tableau. Assurez-vous d'évaluer votre utilisation de eval
avec un œil critique. Si vous n'êtes pas sûr à 100% que Chepner, Glenn Jackman ou Greycat ne trouveront aucune faille dans votre code, utilisez plutôt la boucle for.