J'ai une variable contenant les entrées séparées de l'espace suivantes.
#Not something like this. new_variable=$(echo "$variable"|tr " " "\n"|sort|uniq|tr "\n" " ") echo $new_variable apple avocado banana grapes lemon mango papaya
8 Réponses :
#!/bin/bash variable="apple lemon papaya avocado lemon grapes papaya apple avocado mango banana" temp="$variable" new_variable="${temp%% *}" while [[ "$temp" != ${new_variable##* } ]]; do temp=${temp//${temp%% *} /} new_variable="$new_variable ${temp%% *}" done echo $new_variable;
Doux :) Merci pour l'explication.
Le simple test d'adhésion est meilleur que compter: awk 'begin {rs = ours = ""} {if (! (0 $ 0 dans a)) {A [0 $]; Imprimer}} 'ou plus contrariété: awk' commencer {rs = ours = ""}! (0 $ dans un || a || a [$ 0]) '
@Mark: Faire une "fois" sur une boucle de 10 000 itérations montre que la vôtre est d'un peu plus de 3% plus lente. Pas beaucoup mais néanmoins, pas mieux. Cette différence ne deviendra plus grosse que le nombre d'éléments augmente depuis votre version du temps tandis que le mien est toujours une constante O (1).
Vraiment belle solution, merci. Sauf si des doublons sont trouvés à la fin, l'un après l'autre, cela ne fonctionne pas. Ex: Variable = "Papaya Papaya Apple Papaya": Papaya Papaya Apple Citron. Alors que si j'ai: variable = "mangue de papaye de papaye de pomme de citron" puis, il supprime la papaye et des impressions en double: pomme citron papaya mangue. Les pensées?
J'ai trouvé la solution suivante qui a contribué au problème décrit dans mon commentaire précédent: Stackoverflow.com/Questtions/46185241/... Merci de partager votre solution.
shell résultat lors de l'exécution: p> ou si vous souhaitez utiliser GAWK P> awk 'BEGIN{RS=ORS=" "} (!($0 in a) ){a[$0];print}'
Cette version de pipeline fonctionne en préservant la commande d'origine:
variable=$(echo "$variable" | tr ' ' '\n' | nl | sort -u -k2 | sort -n | cut -f2-)
C'est la seule solution ici qui a fonctionné pour moi. La solution AWK avait toujours des duplicats. Merci.
puure bash:
Une bonne solution, mais note que cela vous verrouille dans Bash 3.x en raison de l'opérateur '= ~'.
z shell:
en pure, portable sh code>:
Un autre AWK code> Solution:
apple lemon papaya avocado grapes mango banana
solution PERL:
Cette variation imprime la sortie triée par la fréquence perl -le 'pour (@argv) {$ h {$ _} ++}; pour (clés% h) {imprimé $ _} '$ variable code> p>
@argv code> est la liste des paramètres d'entrée de
$ variable code> de
Boucle via la liste, remplir le H code> hachage avec la variable de boucle
$ _ code>
Boucle à travers les touches du H code> HASH et imprimez chacune une autre p>
$ h {$ a} $ h {$ B} code>
puis alphabétiquement
$ A cmP $ b code> p>
perl -le 'pour (@argv) {$ h {$ _} ++}; Pour (trier {$ h {$ a} $ h {$ b} || $ A cmP $ b} keys% h) {imprimé "$ h {$ _} \ t $ _"} '$ variable P>
1 banana
1 grapes
1 mango
2 apple
2 avocado
2 lemon
2 papaya