Удалите дубликаты строк из оболочки вывода

#linux #shell #dpkg

Вопрос:

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

Команда:

 dpkg-query -l | grep -Eo 'tomcat[0-9]?' | uniq
 

Выход:

 tomcat8
tomcat9
tomcat8
tomcat9
 

Желаемый Результат:

 tomcat8
tomcat9
 

Комментарии:

1. uniq работает только с отсортированными списками. Как люди указали ниже sort -u , это хорошо подходит для этого, но если вы были настроены на использование uniq , просто добавьте a sort после grep и до uniq .

Ответ №1:

От man uniq :

Примечание: ‘uniq’ не обнаруживает повторяющиеся строки, если они не являются смежными. Возможно, вы захотите сначала отсортировать входные данные или использовать «sort-u» без «uniq». Кроме того, сравнения выполняются в соответствии с правилами, указанными в «LC_COLLATE».

Использование sort -u будет сортировать и печатать только уникальные строки:

 dpkg-query -l | grep -Eo 'tomcat[0-9]?' | sort -u
 

Ответ №2:

сортировка -u должна сработать.

Я тестировал с помощью простого текстового файла, но он работает так же, как и при конвейерном вводе.

 $ cat /tmp/test.txt 
tomcat8
tomcat9
tomcat8
tomcat9
 

С помощью sort -u :

 $ sort -u /tmp/test.txt 
tomcat8
tomcat9
 

Использование uniq дает те же результаты, которые вы испытывали:

 $ uniq /tmp/test.txt 
tomcat8
tomcat9
tomcat8
tomcat9
 

Ответ №3:

Используя один awk , вы можете сделать это:

 dpkg-query -l |
awk 'match($0, /tomcat[0-9]*/) amp;amp; !seen[s=substr($0, RSTART, RLENGTH)]   {print s}'

tomcat8
tomcat9
 

Ответ №4:

 aptitude search ~itomcat[0-9] | sort -u