Удалите все повторяющиеся слова из строки, используя сценарий оболочки

У меня есть строка вроде

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

Я хочу удалить повторяющееся слово из строки, тогда вывод будет похож на

 "aaa,bbb,ccc" 

Я пробовал этот код Источник

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

Он работает отлично с одинаковым значением, но когда я даю значение переменной, он также показывает все дублирующее слово.

Как удалить дублирующее значение.

ОБНОВИТЬ

Мой вопрос добавляет все соответствующее значение в одну строку, если пользователь такой же. У меня есть такие данные ->

  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 

В кодировке я выбираю всех разных пользователей, тогда я успешно конкатенирую строку цвета. Для этого я использую код –

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

Когда я печатаю эту переменную $ c, я получаю вывод (для пользователя AAA)

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

Я хочу удалить повторяющийся цвет. Затем желательно, чтобы результат

 "red,black,blue,green" 

Для этого желаемого вывода я использовал выше код

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

но он отображает результат с повторяющимися значениями.

«красный, черный, синий, красный, зеленый, красный, черный, синий, красный, зеленый,« Спасибо

Еще один awk, просто для удовольствия:

 $ 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 

Кстати, даже ваше решение отлично работает с переменными:

 $ 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 

С tr , sort и uniq

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

или

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

получить одну строку

С gnu sed :

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

Вы можете добавить ;s/ */ /g для удаления пространств дублирования.

Такие функции: если слово в этой строке второе раз, удалите его и начните, пока не будет обнаружено дублирование.

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

Обязательное решение awk:

 $ 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 

(Окончательное echo есть для новой строки)

питон

Опция 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) 

Сделайте исполняемый файл, затем позвоните из Bash:

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

Или вы можете реализовать его как функцию Bash, но синтаксис беспорядочен.

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

Вариант 2

При необходимости этот параметр может стать однострочным:

 #!/usr/bin/env python # get_unique_words.py import sys s_in = sys.argv[1] l_in = s_in.split(',') # Turn string 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 

В Баше:

 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)