Как печатать только уникальные совпадения из регулярного выражения?

Предположим, у меня есть файл со следующим текстом:

  1. Номер 1
  2. NUMBER_3
  3. Номер 1
  4. NUMBER_4

Как я могу использовать регулярное выражение для печати только один раз за каждый номер Number_n ? С помощью:

  • Обнаружение файлов расширений не выполняется за период
  • Какое правильное произношение «grep» и «grub»?
  • Остановить grep после сопоставления файлов Nth
  • Греп странное исключение пустых строк из вывода
  • Извлечение только одной группы из регулярного выражения
  • Использование Grep -o или Sed / Awk для захвата фрагмента из середины строки
  • grep -oE "Number_\w+" 

    Дает мне все спички:

    Номер 1

    NUMBER_3

    Номер 1

    NUMBER_4

    Но я хочу получить следующий результат:

    Номер 1

    NUMBER_3

    NUMBER_4

  • В чем разница между `grep`,` egrep` и `fgrep`?
  • Поиск в корзине s3 с журналами
  • Запуск действия при посещении URL-адреса
  • переформатируйте текстовый файл, чтобы иметь весь текст в одной строке, используя CentOS 5.6
  • grepping dotfiles с -R правильно?
  • Как «grep» строка возвращаемого результата
  • 4 Solutions collect form web for “Как печатать только уникальные совпадения из регулярного выражения?”

    (О, хорошо, редактирование немного меняет вопрос.)

    Легкий способ печати только одной копии каждой выходной строки – передать через sort -u (или sort | uniq ), хотя это, очевидно, будет сортировать вывод.

    Другие связанные с этим решения: печать уникальных строк


    (Ответ на то, что я изначально думал, был вопрос 🙂

    Чтобы напечатать только первую строку, соответствующую регулярному выражению, мы можем использовать grep -m1 ... :

     -m NUM, --max-count=NUM Stop reading a file after NUM matching lines. 

    Если совпадения находятся на разных строках, это работает напрямую, но если у вас несколько строк соответствия в одной строке, то с -o они будут напечатаны, поэтому добавьте что-то вроде | head -1 | head -1 .

     grep -oE "Number_\w+" | sort -u 

    С GNU grep :

     $ echo Number_1 Number_2 | grep -Pom1 '^.*?\KNumber_\d+' Number_1 

    Это совпадение с начала строки до первого появления Number_\d+ , но с \K отбросить то, что находится слева от него.

     $ awk '{print $NF}' file | sort -u Number_1 Number_3 Number_4 $ awk '{Arr[$NF]++}END{for(i in Arr)print i}' file Number_3 Number_4 Number_1 
    Linux и Unix - лучшая ОС в мире.