Печать уникальных строк

Есть ли лучшее решение для печати уникальных строк, отличных от комбинации sort и uniq ?

  • Unix - поиск имен с egrep
  • Повторить слова, разбитые символами дефиса и двойной символа новой строки
  • Получить номера строк для пустых строк
  • Каким образом можно извлечь сегмент из текстового файла?
  • Перенести первые N строк вывода в конец без использования временного файла
  • Поиск строк в файлах и представление четырех строк контекста (совпадение и три следующих)
  • Извлечь строку, если первое поле содержит точку
  • Шаблоны значений для сценария bash для файлов apache conf
  • 4 Solutions collect form web for “Печать уникальных строк”

    Чтобы напечатать каждую идентичную строку только в одном порядке:

     sort -u 

    Чтобы напечатать только уникальные строки в любом порядке:

     sort | uniq -u 

    Чтобы печатать каждую идентичную строку только один раз, в порядке их первого появления: (для каждой строки печатайте строку, если она еще не была видна, затем в любом случае увеличивайте видимый счетчик)

     awk '!seen[$0] {print} {++seen[$0]}' 

    Чтобы напечатать только уникальные строки в порядке их первого появления: (запишите каждую строку в seen , а также в lines если это первое вхождение; в конце ввода напечатайте строки в порядке их появления, но только те, видно только один раз)

     awk '!seen[$0]++ {lines[i++]=$0} END {for (i in lines) if (seen[lines[i]]==1) print lines[i]}' 

    Некоторые (большинство?) Версий sort имеют флаг -u , который напрямую выполняет часть uniq . Могут быть некоторые ограничения длины строки в зависимости от реализации, но у вас были те, которые уже имеют простой sort|uniq .

    Работает ли Perl для вас? Он может сохранять строки в исходном порядке, даже если дубликаты не смежны. Вы также можете закодировать его в Python или awk .

     while (<>) { print if $lines{$_}++ == 0; } 

    Который может быть сокращен до

     perl -ne 'print unless $lines{$_}++;' 

    Данный входной файл:

     abc def abc ghi abc def abc ghi jkl 

    Он дает выход:

     abc def ghi jkl 

    Для последней части ответа, упомянутого в: Печать уникальных строк @Gilles в качестве ответа на этот вопрос, я попытался устранить необходимость использования двух хэшей.

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

    awk '{counter[$0]++} END {for (line in counter) if (counter[line]==1) print line}'

    Здесь «counter» хранит подсчет каждой строки, которая аналогична предыдущей.
    В конце мы печатаем только те строки, у которых значение счетчика равно 1.

    Interesting Posts

    Как использовать тройник для захвата STDOUT из кодового блока в имя файла, определенное в блоке?

    Прикрепление двух сетевых карт двумя разными драйверами

    Существуют ли какие-либо инструменты cli для рисования графики на экране во время X-сессии?

    хотите последнюю строку при дублировании awk?

    Как переопределить все папки с помощью cp?

    Повторно выполнить команду fc из истории

    Вход Keyring в Fedora 25

    как выполнить ping и использовать определенную сетевую карту

    Logrotate: «log не нужно вращать» почему?

    Каковы последствия для безопасности, связанные с отсутствием источников «security.debian.org» из sources.list в Debian Jessie?

    Написание однострочных макетов для X

    Debian Jessie без systemd и с initramfs зависает при загрузке

    Использование клавиш VI для редактирования команд оболочки в UNIX

    Вставка некоторого текста с вкладками в документ здесь в окне PuTTY

    X Изображение после курсора указателя мыши

    Linux и Unix - лучшая ОС в мире.