J'ai une chaîne comme
"aaa,aaa,aaa,bbb,bbb,ccc,bbb,ccc"
Je veux supprimer le mot en double de la chaîne, 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 très bien avec la même valeur, mais lorsque je donne ma valeur de variable, il affiche également tous les mots en double.
Comment puis-je supprimer la valeur en double.
METTRE À JOUR
Ma question est d'ajouter toutes les valeurs correspondantes dans une seule chaîne si l'utilisateur est le même. J'ai des données comme celle-ci ->
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 codage, je récupère tous les utilisateurs distincts, puis je concatène la chaîne de couleur avec succès. Pour que j'utilise du code -
while read the records
if [ "$c" == "" ]; then #$c I defined global
c="$colour1"
else
c="$c,$colour1"
fi
Lorsque j'imprime cette variable $ c, j'obtiens la sortie (pour l'utilisateur AAA)
"red,black,blue,red,green,red,black,blue,red,green,"
Je veux supprimer la couleur en double. La sortie souhaitée devrait alors être comme
"red,black,blue,green"
Pour cette sortie souhaité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.
"rouge, noir, bleu, rouge, vert, rouge, noir, bleu, rouge, vert", merci
echo 'aaa aaa aaa bbb bbb ccc bbb ccc' | xargs -n1 | sort -u | xargs
donneaaa bbb ccc
.. donc vous devez montrer le code exact que vous avez fatigué et le résultat que vous avez obtenu .. avec la chaîne en variable:s='aaa aaa aaa bbb bbb ccc bbb ccc'; echo "$s" | xargs -n1 | sort -u | xargs
Réponses:
Encore un awk, juste pour le plaisir:
Soit dit en passant, même votre solution fonctionne bien avec des variables:
la source
%s
place de%s%s
. La raison en est que je faisais une boucle for à travers les résultats et deux espaces blancs ont causé des problèmes avec les correspondances d'expression régulière.Avec
tr
,sort
etuniq
ou
pour obtenir une ligne
la source
| xargs
pour joindre à nouveau la sortie à une lignesort -u
. Ou même unawk '!u[$0]++
.sort -u
. J'utilisesort | uniq
tout ce temps. Les frappesla source
Avec gnu
sed
:Vous pouvez ajouter
;s/ */ /g
pour supprimer les espaces en double.Fonctions comme ceci: Si un mot est une deuxième fois dans cette ligne, supprimez-le et recommencez jusqu'à ce qu'aucune duplication ne soit trouvée.
la source
\<
et\>
?la source
Solution awk obligatoire:
(La finale
echo
est là pour la nouvelle ligne)la source
sort
solution ne tient pas l'ordre initial soit, cependant.awk -vRS=" " -vORS=" " '!a[$1]++ {print $1}' ; echo
cela préserve la commande.Python
Option 1
Rendez exécutable, puis appelez depuis Bash:
Ou vous pouvez l'implémenter en tant que fonction Bash, mais la syntaxe est désordonnée.
Option 2
Cette option peut devenir monoligne si nécessaire:
Dans Bash:
la source
la source
awk
implémentation particulière utilisée (asorti()
n'est pas uneawk
fonction standard ).Utilisation des données tabulaires d'origine dans le fichier appelé
file
:Cela génère
Les trois étapes du pipeline:
sed
commande supprime la première ligne qui est un en-tête que nous ne voulons pas lire.La
sort
commande nous donne des lignes uniques. Les échantillons de données après lessort
regards commeawk
commande prend ces données et produit une chaîne délimitée par des virgules pour chaque utilisateur du tableaucolor
(où le nom d'utilisateur est la clé du tableau). À la fin (dans leEND
bloc), toutes les données collectées sont sorties.la source
la source