Supprimer tout mot en double de la string en utilisant le script shell

J'ai une string comme

"aaa,aaa,aaa,bbb,bbb,ccc,bbb,ccc" 

Je veux supprimer le mot en double de la string puis la sortie sera comme

 "aaa,bbb,ccc" 

J'ai essayé ce code Source

 $ echo "zebra ant spider spider ant zebra ant" | xargs -n1 | sort -u | xargs 

Il fonctionne bien avec la même valeur, mais quand je donne ma valeur de variable alors il montre également tous les mots en double.

Comment puis-je supprimer la valeur en double.

METTRE À JOUR

Ma question est d'append toute la valeur correspondante dans une seule string si l'user est le même. J'ai des données comme ceci ->

  user name | colour AAA | red AAA | black BBB | red BBB | blue AAA | blue AAA | red CCC | red CCC | red AAA | green AAA | red AAA | black BBB | red BBB | blue AAA | blue AAA | red CCC | red CCC | red AAA | green 

Dans le encoding, je récupère tous les users distincts puis je concatène la string de colors avec succès. Pour cela j'utilise du code –

 while read the records if [ "$c" == "" ]; then #$c I defined global c="$colour1" else c="$c,$colour1" fi 

Quand j'imprime cette variable $ c j'obtiens la sortie (pour l'user AAA)

 "red,black,blue,red,green,red,black,blue,red,green," 

Je veux supprimer la couleur en double .Puis la sortie désirée devrait être comme

 "red,black,blue,green" 

Pour cette sortie désirée j'ai utilisé le code ci-dessus

  echo "zebra ant spider spider ant zebra ant" | xargs -n1 | sort -u | xargs 

mais il affiche la sortie avec des valeurs en double. Comme

"rouge, noir, bleu, rouge, vert, rouge, noir, bleu, rouge, vert," Merci

Encore une awk, juste pour le plaisir:

 $ a="aaa bbb aaa bbb ccc aaa ddd bbb ccc" $ echo "$a" | awk '{for (i=1;i<=NF;i++) if (!a[$i]++) printf("%s%s",$i,FS)}{printf("\n")}' aaa bbb ccc ddd 

Par ailleurs, même votre solution fonctionne bien avec des variables:

 $ b="zebra ant spider spider ant zebra ant" $ echo "$b" | xargs -n1 | sort -u | xargs ant spider zebra 
 $ echo "zebra ant spider spider ant zebra ant" | awk -v RS="[ \n]+" '!n[$0]++' zebra ant spider 

Avec tr , sort et uniq

 echo "zebra ant spider spider ant zebra ant" | tr ' ' '\n' | sort | uniq 

ou

 echo "zebra ant spider spider ant zebra ant" | tr ' ' '\n' | sort | uniq | xargs 

get une ligne

Avec gnu sed :

 sed ':s;s/\(\<\S*\>\)\(.*\)\<\1\>/\1\2/g;ts' 

Vous pouvez append ;s/ */ /g pour supprimer les espaces en double.

Fonctions comme ceci: Si un mot est une deuxième fois dans cette ligne, retirez-le et recommencez jusqu'à ce que plus aucune dublication ne soit trouvée.

 perl -lane '$,=$";print grep { ! $h{$_}++ } @F' 

Solution awk obligatoire:

 $ echo "ant zebra ant spider spider ant zebra ant" | awk -vRS=" " -vORS=" " '!a[$1] {a[$1]++} END{ for (x in a) print x; } ' ; echo zebra ant spider 

(L' echo final est là pour la nouvelle ligne)

Python

Option 1

 #!/usr/bin/env python # get_unique_words.py import sys l = [] for w in sys.argv[1].split(','): if w not in l: l += [ w ] print ','.join(l) 

Faites un exécutable, puis appelez de Bash:

 $ ./get_unique_words.py "aaa,aaa,aaa,bbb,bbb,ccc,bbb,ccc" aaa,bbb,ccc 

Ou vous pouvez l'implémenter comme une fonction Bash, mais la syntaxe est désordonnée.

 get_unique_words(){ python -c " l = [] for w in '$1'.split(','): if w not in l: l += [ w ] print ','.join(l)" } 

Option 2

Cette option peut devenir une ligne unique si nécessaire:

 #!/usr/bin/env python # get_unique_words.py import sys s_in = sys.argv[1] l_in = s_in.split(',') # Turn ssortingng into a list. set_out = set(l_in) # Turning a list into a set removes duplicates items. s_out = ','.join(set_out) print s_out 

En Bash:

 get_unique_words(){ python -c "print ','.join(set('$1'.split(',')))" } 
 a="aaa aaa aaa bbb bbb ccc bbb ccc" for item in $a do echo $item done | sort -u | (while read i; do ans="$ans $i"; done ; echo $ans)