У меня есть строка как
"aaa,aaa,aaa,bbb,bbb,ccc,bbb,ccc"
Я хочу удалить повторяющееся слово из строки, тогда вывод будет
"aaa,bbb,ccc"
Я попробовал этот код Source
$ 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
но он отображает вывод с повторяющимися значениями. Как
"красный, черный, синий, красный, зеленый, красный, черный, синий, красный, зеленый" Спасибо
echo 'aaa aaa aaa bbb bbb ccc bbb ccc' | xargs -n1 | sort -u | xargs
даетaaa bbb ccc
.. так что вам нужно показать точный код, который вы устали и вывод, который вы получили .. со строкой в переменной:s='aaa aaa aaa bbb bbb ccc bbb ccc'; echo "$s" | xargs -n1 | sort -u | xargs
Ответы:
Еще один awk, просто для удовольствия:
Кстати, даже ваше решение отлично работает с переменными:
источник
%s
вместо%s%s
. Причина в том, что я делал цикл for для результатов, и два пробела вызвали некоторые проблемы с совпадениями регулярных выражений.С
tr
,sort
иuniq
или
чтобы получить одну линию
источник
| xargs
чтобы снова объединить вывод в одну строкуsort -u
. Или дажеawk '!u[$0]++
.sort -u
. Я использовалsort | uniq
все это время.источник
С гну
sed
:Вы можете добавить,
;s/ */ /g
чтобы удалить дублирующие пробелы.Функции, подобные этой: Если слово находится во второй раз в этой строке, удалите его и начинайте сначала, пока повторное копирование не будет найдено.
источник
\<
и\>
?источник
Обязательное решение для awk:
(Финал
echo
там для новой строки)источник
sort
решение не сохраняет первоначальный порядок.awk -vRS=" " -vORS=" " '!a[$1]++ {print $1}' ; echo
это сохраняет порядок.питон
Опция 1
Сделайте исполняемый файл, затем позвоните из Bash:
Или вы могли бы реализовать это как функцию Bash, но синтаксис грязный.
Вариант 2
Эта опция может стать однострочной, если это необходимо:
В Баш:
источник
источник
awk
реализации (asorti()
не является стандартнойawk
функцией).Использование исходных табличных данных в файле называется
file
:Это генерирует
Три шага конвейера:
sed
удаляет первую строку, которая является заголовком, который мы не хотим читать.Команда
sort
дает нам уникальные строки. Пример данных послеsort
выглядит какawk
берет эти данные и создает разделенную запятыми строку для каждого пользователя в массивеcolor
(где имя пользователя является ключом в массиве). В конце (вEND
блоке) выводятся все собранные данные.источник
источник