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)
#!/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)" }
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)