Разное

Bash uniq: Команда uniq Linux | Losst

Содержание

Команда uniq Linux | Losst

Команда uniq предназначена для поиска одинаковых строк в массивах текста. При этом с найденными совпадениями пользователь может совершать множество действий — например, удалять их из вывода либо наоборот, выводить только их.

Работа команды осуществляется как с текстовыми файлами (в том числе, записями скриптов), так и с текстом, напечатанным в командной строке терминала.

Содержание статьи:

Синтаксис uniq

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

$ uniq опции файл_источник файл_для_записи

Файл источник указывает откуда надо читать данные, а файл для записи — куда писать результат. Но их указывать не обязательно. В примерах мы будем набирать текст, который нуждается в редактировании, прямо в командную строку терминала, воспользовавшись ещё одной командой — echo, и применив к ней опцию -e. Это будет выглядеть так:

echo -e [текст, слова в котором разделены управляющей последовательностью\\n] | uniq

Эта управляющая последовательность нужна, чтобы указать утилите, что каждое слово выводится в новой строке. Если указано только название файла источника, результат выполнения команды появится прямо в окне терминала. А при наличии выходного файла текст будет напечатан в теле документа.

Опции uniq

У команды uniq есть такие основные опции:

  • -u (—unique) — выводит исключительно те строки, у которых нет повторов.
  • -d (—repeated) — если какая-либо строка повторяется несколько раз, она будет выведена лишь единожды.
  • -D — выводит только повторяющиеся строки.
  • —all-repeated[=МЕТОД] — то же самое, что и -D, но при использовании этой опции между группами из одинаковых строк при выводе будет отображаться пустая строка. [=МЕТОД] может иметь одно из трех значений — none (применяется по умолчанию), separate или prepend.
  • —group[=МЕТОД] — выводит весь текст, при этом разделяя группы строк пустой строкой. [=МЕТОД] имеет значения separate (по умолчанию), prepend, append и both, среди которых нужно выбрать одно.

Вместе с основными опциями могут применяться дополнительные. Они нужны для более тонких настроек работы команды:

  • -f (—skip-fields=N) — будет проведено сравнение полей, начиная с номера, который следует после указанного вместо буквы N. Поля — это слова, хотя, называть их словами в прямом смысле слова нельзя, ведь словом команда считает любую последовательность символов, отделенную от других последовательностей пробелом либо табуляцией.
  • -i (—ignore-case) — при сравнении не будет иметь значение регистр, в котором напечатаны символы (строчные и заглавные буквы).
  • -s (—skip-chars=N) — работает по аналогии с -f, однако, игнорирует определенное количество символов, а не строк.
  • -c (—count) — в начале каждой строки выводит число, которое обозначает количество повторов.
  • -z (—zero-terminated) — вместо символа новой строки при выводе будет использован разделитель строк NULL.
  • -w (—check-chars=N) — указание на то, что нужно сравнивать только первые N символов в строках.

Примеры использования uniq

Прежде всего следует отметить главную особенность команды uniq — она сравнивает только строки, которые находятся рядом. То есть, если две строки, состоящие из одинакового набора символов, идут подряд, то они будут обнаружены, а если между ними расположена строка с отличающимся набором символов — то не будут поэтому перед сравнением желательно отсортировать строки с помощью sort. Без задействования файлов uniq работает так:

echo -e небо\\nоблака\\nоблака\\nоблака\\nсолнце\\nзвезды | uniq

После команды uniq можно использовать её опции. Вот пример вывода, где не просто удалены повторы, но и указано количество одинаковых строк:

echo -e небо\\nоблака\\nоблака\\nоблака\\nсолнце\\nзвезды | uniq -c

Теперь применим команду к тексту, который находится в файле.

uniq --all-repeated=prepend text-example.txt

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

Причина этого — незаметный глазу символ пробела, который стоит в конце одной из строк первой группы. Нужно быть предельно внимательным при использовании uniq, чтобы получить качественный результат.

Используемая опция —all-repeated=prepend выполнила свою работу — добавила пустые строки в начало, в конец и между группами строк. Теперь попробуем сравнить только первые 5 символов в каждой строке.

echo -e небо исполосовано молниями\\nоблака на небе\\nоблака разогнал ветер\\nоблака закрыли солнце\\nсолнце светит ярко\\nзвезды кажутся огромными | uniq -w5

Как видно на скриншоте, повторяющиеся строки, которые начинались словом «облака», были удалены. Осталась только первая из них. Вывод только уникальных строк с использованием опции -u выглядит так:

echo -e небо\\nоблака\\nоблака\\nоблака\\nсолнце\\nзвезды | uniq -u

Чтобы проигнорировать определенное количество символов в начале одинаковых строк, воспользуемся опцией —skip-chars. В данном случае команда пропустит слово «облака», сравнив слова «перистые» и «белые».

echo -e небо\\nоблака перистые\\nоблака перистые\\nоблака белые\\nсолнце\\nзвезды | uniq --skip-chars=6

А вот наглядная демонстрация отличий при использовании опции —group с разными значениями. both добавило пустые строки как перед текстом, так и после него, а также между группами строк.

echo -e небо\\nоблака\\nоблака\\nоблака\\nсолнце\\nзвезды | uniq --group=both

Тогда как append не добавило пустую строку перед текстом:

echo -e небо\\nоблака\\nоблака\\nоблака\\nсолнце\\nзвезды | uniq --group=append

Выводы

Команда uniq linux пригодится тем, кто часто и много работает с массивами текста, не имея возможности вычитывать их самостоятельно. Следует заметить, что не все версии uniq работают исправно, поэтому иногда результат выдачи может отличаться от ожидаемого.

Свои вопросы относительно использования команды, а также замечания и пожелания оставляйте в комментариях.

Команда Uniq в Linux с примерами

Научитесь использовать команду uniq в Unix и Linux с этими практическими примерами.

Команда uniq в Unix и Linux используется для фильтрации дублированного текста. Она может использоваться сама по себе, но обычно используется вместе с другими командами, такими как определение избыточной информации в файле.

Вот синтаксис команды uniq:

uniq [options] <input-file> <output-file>

 

Когда вы запускаете uniq без параметров, она будет использоваться с stdin и stdout для ввода и вывода.

Хотя использование stdin возможно при использовании буфера обмена (копирование/вставка), но это не самое практичное использование.

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

Одним из ограничений команды uniq является то, что она будет идентифицировать только дубликаты, которые находятся рядом друг с другом в файле. Это довольно просто, но позвольте нам показать вам пример, чтобы вы могли увидеть его в действии.

[andreyex@fedora ~]$ cat debian.txt
debian
debian
centos
centos
debian 
centos
[andreyex@fedora ~]$ uniq debian.txt 
debian
centos
debian 
centos

 

Таким образом, вы сразу знаете, что не можете доверять программе, чтобы идентифицировать каждый дубликат самостоятельно. Есть несколько способов обойти это, и обычно это происходит с помощью команды sort .

Мы покажем вам это позже в этой статье. Во-первых, позвольте нам показать некоторые примеры, чтобы познакомить вас с ‘uniq’, прежде чем смешивать другие команды и, возможно, сбивать с толку.

 

7 примеров команды uniq в Linux

Мы использовали настоящий системный журнал, но редактировали его для демонстрационных целей. Большая часть файла уже отсортирована в соседнем порядке, но мы оставили пару строк «не на своем месте», чтобы показать функциональность команды uniq.

/usr/lib/gdm3/gdm-x-session[1242]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1242]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1242]: (II) event9  - Intel HID events: device is a keyboard
/usr/lib/gdm3/gdm-x-session[1242]: (II) event9  - Intel HID events: device is a keyboard
/usr/lib/gdm3/gdm-x-session[1242]: (II) event9  - Intel HID events: device removed
/usr/lib/gdm3/gdm-x-session[1242]: (II) event9  - Intel HID events: is tagged by udev as: Keyboard
/usr/lib/gdm3/gdm-x-session[1242]: (II) event9  - Intel HID events: is tagged by udev as: Keyboard
/usr/lib/gdm3/gdm-x-session[1242]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1242]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1242]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1242]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1242]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1242]: (II) systemd-logind: got fd for /dev/input/event10 13:74 fd 55 paused 0
/usr/lib/gdm3/gdm-x-session[1242]: (II) This device may have been added with another device file.
/usr/lib/gdm3/gdm-x-session[1242]: (II) This device may have been added with another device file.
/usr/lib/gdm3/gdm-x-session[1242]: (II) This device may have been added with another device file.
/usr/lib/gdm3/gdm-x-session[1242]: (II) This device may have been added with another device file.
/usr/lib/gdm3/gdm-x-session[1242]: (II) This device may have been added with another device file.
/usr/lib/gdm3/gdm-x-session[1242]: (II) This device may have been added with another device file.
/usr/lib/gdm3/gdm-x-session[1242]: (II) This device may have been added with another device file.
PackageKit: get-updates transaction /354_eebeebaa from uid 1000 finished with success after 1514ms
wpa_supplicant[754]: RRM: Ignoring radio measurement request: Not RRM network
wpa_supplicant[754]: RRM: Ignoring radio measurement request: Not RRM network
wpa_supplicant[754]: RRM: Ignoring radio measurement request: Not RRM network
wpa_supplicant[754]: RRM: Ignoring radio measurement request: Not RRM network
wpa_supplicant[754]: RRM: Ignoring radio measurement request: Not RRM network
wpa_supplicant[754]: RRM: Ignoring radio measurement request: Not RRM network
wpa_supplicant[754]: RRM: Ignoring radio measurement request: Not RRM network
wpa_supplicant[754]: RRM: Ignoring radio measurement request: Not RRM network

 

Пример 1. Использование команды uniq по умолчанию

Хотя мы уже показали вам это, давайте посмотрим на наш пример файла с использованием синтаксиса по умолчанию.

[andreyex@fedora ~]$ uniq sample_log_file.txt 
/usr/lib/gdm3/gdm-x-session[1242]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1242]: (II) event9  - Intel HID events: device is a keyboard
/usr/lib/gdm3/gdm-x-session[1242]: (II) event9  - Intel HID events: device removed
/usr/lib/gdm3/gdm-x-session[1242]: (II) event9  - Intel HID events: is tagged by udev as: Keyboard
/usr/lib/gdm3/gdm-x-session[1242]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1242]: (II) systemd-logind: got fd for /dev/input/event10 13:74 fd 55 paused 0
/usr/lib/gdm3/gdm-x-session[1242]: (II) This device may have been added with another device file.
PackageKit: get-updates transaction /354_eebeebaa from uid 1000 finished with success after 1514ms
wpa_supplicant[754]: RRM: Ignoring radio measurement request: Not RRM network

 

Вы можете видеть, что много повторяющихся строк объединены, но они все еще содержат избыточную информацию. Это связано с функциональным ограничением, которое мы уже описывали. Давайте рассмотрим еще несколько примеров и рассмотрим некоторые параметры, встроенные в утилиту командной строки ‘uniq’.

 

Пример 2: Вывести отфильтрованные результаты в файл назначения

Вы можете сохранить этот вывод, чтобы вы могли легко отредактировать или сохранить его. Вы можете направить наш вывод в отдельный файл вместо обычного stdout (терминала). Важно отметить, что вы не можете использовать этот формат для переопределения исходного файла.

[andreyex@fedora ~]$ uniq sample_log_file.txt uniq_log_output.txt

 

Вот содержимое выходного файла:

[andreyex@fedora ~]$ cat uniq_log_output.txt 
/usr/lib/gdm3/gdm-x-session[1242]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1242]: (II) event9  - Intel HID events: device is a keyboard
/usr/lib/gdm3/gdm-x-session[1242]: (II) event9  - Intel HID events: device removed
/usr/lib/gdm3/gdm-x-session[1242]: (II) event9  - Intel HID events: is tagged by udev as: Keyboard
/usr/lib/gdm3/gdm-x-session[1242]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1242]: (II) systemd-logind: got fd for /dev/input/event10 13:74 fd 55 paused 0
/usr/lib/gdm3/gdm-x-session[1242]: (II) This device may have been added with another device file.
PackageKit: get-updates transaction /354_eebeebaa from uid 1000 finished with success after 1514ms
wpa_supplicant[754]: RRM: Ignoring radio measurement request: Not RRM network

 

Пример 3: Использование ‘-c’, чтобы получить количество повторных строк

Этот вариант довольно понятен. Программа добавит счет в начало каждой строки.

[andreyex@fedora ~]$ uniq sample_log_file.txt -c
      2 /usr/lib/gdm3/gdm-x-session[1242]: (II) No input driver specified, ignoring this device.
      2 /usr/lib/gdm3/gdm-x-session[1242]: (II) event9  - Intel HID events: device is a keyboard
      1 /usr/lib/gdm3/gdm-x-session[1242]: (II) event9  - Intel HID events: device removed
      2 /usr/lib/gdm3/gdm-x-session[1242]: (II) event9  - Intel HID events: is tagged by udev as: Keyboard
      5 /usr/lib/gdm3/gdm-x-session[1242]: (II) No input driver specified, ignoring this device.
      1 /usr/lib/gdm3/gdm-x-session[1242]: (II) systemd-logind: got fd for /dev/input/event10 13:74 fd 55 paused 0
      7 /usr/lib/gdm3/gdm-x-session[1242]: (II) This device may have been added with another device file.
      1 PackageKit: get-updates transaction /354_eebeebaa from uid 1000 finished with success after 1514ms
      8 wpa_supplicant[754]: RRM: Ignoring radio measurement request: Not RRM network

 

Пример 4: печатать только повторяющиеся строки с ‘-d’

Как видите, отображаются только строки, которые дублируются по всему файлу, если вы используете опцию -d команды uniq.

[andreyex@fedora ~]$ uniq sample_log_file.txt -d
/usr/lib/gdm3/gdm-x-session[1242]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1242]: (II) event9  - Intel HID events: device is a keyboard
/usr/lib/gdm3/gdm-x-session[1242]: (II) event9  - Intel HID events: is tagged by udev as: Keyboard
/usr/lib/gdm3/gdm-x-session[1242]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1242]: (II) This device may have been added with another device file.
wpa_supplicant[754]: RRM: Ignoring radio measurement request: Not RRM network

 

Пример 5: печатать только уникальные строки с ‘-u’

Здесь вы получите обратный вывод предыдущей команды. Ни одна из этих команд не повторяется в файле.

[andreyex@fedora ~]$ uniq sample_log_file.txt -u
/usr/lib/gdm3/gdm-x-session[1242]: (II) event9  - Intel HID events: device removed
/usr/lib/gdm3/gdm-x-session[1242]: (II) systemd-logind: got fd for /dev/input/event10 13:74 fd 55 paused 0
PackageKit: get-updates transaction /354_eebeebaa from uid 1000 finished with success after 1514ms

 

Пример 6: Игнорировать поля или символы с помощью uniq [‘-f’ и ‘-s’]

Это действительно два примера, но функции практически идентичны. Мы объясняем, как они работают, а затем предоставляем некоторую ясность в различиях между ними двумя.

Каждый из них использует следующий синтаксис

Skip fields with:
uniq <source_file> -f N
Skip characters with:
uniq <source_file> -s N

 

В каждом из этих примеров «N» – это количество элементов, которые вы хотите пропустить. Когда вы пропустите это количество элементов, uniq начнет сравнение в этой точке, а не сравнивает всю строку.

Опция ‘f’ пропустит назначенное количество полей. Поля будут интерпретироваться с использованием пробела.

[andreyex@fedora ~]$ cat field_separated_values.txt 
blue fish
blue fish
blue fish
blue class
red fish
green fish
two class
two class

 

Если вы хотите использовать команду uniq во втором столбце, вам придется пропустить первое поле следующим образом:

[andreyex@fedora ~]$ uniq -f1 field_separated_values.txt  
blue fish
blue class
red fish
two class

 

Как вы можете видеть, для одной и той же строки требуются «red fish» и «green fish», поскольку первое поле (с цветами) было проигнорировано. Если вы используете здесь опцию count, она покажет количество найденных уникальных строк:

[andreyex@fedora ~]$ uniq -f1 -c field_separated_values.txt  
      3 blue fish
      1 blue class
      2 red fish
      2 two class

 

Зачем вам это нужно? Мы дадим вам практический сценарий. Многие файлы журналов имеют временную метку в начале строк. Если вы хотите найти в таком файле только уникальные строки, вы можете пропустить первое поле с отметкой времени с параметром -f.

Точно так же вы можете пропустить определенное количество символов.

[andreyex@fedora ~]$ uniq -s 10 field_separated_values.txt 
blue    fish

 

Пример 7. Используйте ‘-w’, чтобы сравнить только N символов

Параметр ‘-w’ позволяет нам указать точное количество символов, которое будет использоваться в нашем сравнении.

Если вы использовали файл журнала для предыдущих примеров, это нормально. Мы хотели сделать текст сравнения немного проще, чтобы избежать путаницы. Если нет, давайте вернемся назад и посмотрим, что произойдет, если вы используете только первые символы для поиска дубликатов.

[andreyex@fedora ~]$ uniq -w 4 sample_log_file.txt 
/usr/lib/gdm3/gdm-x-session[1242]: (II) No input driver specified, ignoring this device.
PackageKit: get-updates transaction /354_eebeebaa from uid 1000 finished with success after 1514ms
wpa_supplicant[754]: RRM: Ignoring radio measurement request: Not RRM network

 

Все строки, начинающиеся с «/usr», теперь обозначаются как «одинаковые» с точки зрения программы.

Это может оказаться полезным, если вы ищете конкретное событие журнала.

 

Бонус: избегайте неполных совпадений, используя «sort» и «uniq» одновременно.

Вы можете запускать эти команды отдельно для достижения того же эффекта, но если вы никогда не использовали конвейер (символ |) в Linux, это отличный способ узнать о них.

Вы можете использовать каналы для комбинирования различных команд, чтобы сэкономить нам нажатия клавиш и улучшить наш рабочий процесс. Команды будут выполняться в порядке их ввода.

Это пример ввода, который мы собираемся использовать:

[andreyex@fedora ~]$ cat debian.txt 
debian
centos
centos
debian
debian
fedora
debian
fedora

 

Теперь давайте отсортируем входной файл и затем используем команду uniq. Команда sort переупорядочивает текст так, что все элементы сначала располагаются в соседнем порядке. Затем, когда команда uniq запущена, она находит только 3 уникальные строки в файле.

[andreyex@fedora ~]$ sort debian.txt | uniq 
debian
fedora
centos

Если вы измените порядок, все изменится. Выполнение команды ‘uniq’ сначала идентифицирует только смежные дубликаты, а затем они будут отсортированы в алфавитном порядке с помощью команды ‘sort’.

[andreyex@fedora ~]$ uniq debian.txt | sort
debian
debian
debian
fedora
fedora
centos

 

Каналы позволяют нам запускать несколько команд одновременно, но важно учитывать их порядок.

Обратите внимание, что содержимое файла остается неизменным так же, как и при отдельном запуске команд. Соединение двух команд вместе также сохраняет результаты в «памяти» системы. Если вы запускаете их отдельно, вы не сможете получить эти результаты, пока не создадите новый файл и не используете его для перезаписи содержимого оригинала перед выполнением второй команды.

 

Вывод

Как вы можете себе представить, это делает это важной концепцией в обучении bash. Эти конкретные команды (sort и uniq) часто используются вместе для быстрой фильтрации информации из больших файлов.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Uniq — Ай да Linux Wiki

Описание

uniq — утилита Unix, с помощью которой можно вывести или отфильтровать повторяющиеся строки в файле. Если входной файл задан как («-») или не задан вовсе, чтение производится из стандартного ввода. Если выходной файл не задан, запись производится в стандартный вывод. Вторая и последующие копии повторяющихся соседних строк не записываются. Повторяющиеся входные строки не распознаются, если они не следуют строго друг за другом, поэтому может потребоваться предварительная сортировка файлов.

Использование

 uniq [-c | -d | -u] [-i] [-f число_полей] [-s число_символов] [входной_файл [выходной_файл]]

Опции программы имеют следующие значения:

-u Выводить только те строки, которые не повторяются на входе.

-d Выводить только те строки, которые повторяются на входе.

-c Перед каждой строкой выводить число повторений этой строки на входе и один пробел.

-i Сравнивать строки без учёта регистра.

-s число_символов

Игнорировать при сравнении первые число_символов символов каждой строки ввода. Если эта опция указана совместно с -f, то будут игнорироваться первые число_полей полей, а затем ещё число_символов символов. Символы также нумеруются начиная с единицы.

-f число_полей

Игнорировать при сравнении первые число_полей полей каждой строки ввода. Полем является строка непробельных символов, отделённая от соседних полей пробельными символами. Поля нумеруются начиная с единицы.

Команда uniq без опций

Если в тексте следует подряд несколько одинаковых строк, то команда uniq уменьшит их количество до одной.

 echo -e 1234\\n2345\\n3456\\n1111\\n1111\\n1111 | uniq
 
 1234
 2345
 3456
 1111

Расшифрую этот пример. Команду echo, при помощи опции -e можно заставить печатать не в строчку, как обычно, а в несколько строк. Для этого нужно в конце каждой будущей строки поставить знак новой строки \n, а чтобы «экранировать» обратный слэш (\), который сам по себе тоже является знаком, нужно этот обратный слэш удвоить: \\, и получится \\n. Например, напечатаем в две строки какой-нибудь стишок, например:

 echo -e Глупый пингвин\\nРобко прячет
 
 Глупый пингвин
 Робко прячет

(Кто не знает, сообщу по секрету, что великий пролетарский писатель Максим Горький в слове пингвин ставил ударение на первом слоге — пИнгвин). Пробел между знаком новой строки и первым словом следующей строки не ставится, иначе получится «лесенка»:

 echo -e Глупый пингвин\\n Робко прячет
 Глупый пингвин
 Робко прячет

как в стихах другого великого пролетарского поэта Маяковского:

 echo -e Били копыта\\n пели как-будто...
 
 Били копыта
 пели как-будто...

Но довольно поэзии; вернемся к нашему числовому примеру:

 echo -e 1234\\n2345\\n3456\\n1111\\n1111\\n1111 | uniq
 
 1234
 2345
 3456
 1111

Итак, в первой части этого программного канала команда echo -e, которая выводит на стандартный вывод столбик чисел. Вывод этот канализируется на ввод команды uniq, которая уменьшает количество одинаковых строк (1111) до одной.

Тут нужно уточнить очень интересную вещь: команда uniq сравнивает только рядом расположенные строчки, и если составить столбик цифр в другом порядке, скажем:

 echo -e 1234\\n1111\\n2345\\n1111\\n3456\\n1111 | uniq
 
 1234
 1111
 2345
 1111
 3456
 1111

то никакого уменьшения числа повторов не произойдет. Становится понятным, что команда uniq любит уже отсортированные тексты, где все одинаковые строчки собраны вместе. Такой сортировкой славится команда sort, вот и добавим ее в наш программный канал:

 echo -e 1234\\n1111\\n2345\\n1111\\n3456\\n1111 | sort | uniq
 1111
 1234
 2345
 3456

Команда sort сортирует, команда uniq убирает повторы, кажется все прекрасно, если бы не одно «но» — у программы sort есть опция -u, которая справляется с этой задачей не хуже:

 echo -e 1234\\n1111\\n2345\\n1111\\n3456\\n1111 | sort -u
 
 1111
 1234
 2345
 3456

Получается, что команда uniq как бы и не нужна…

Не спешите с выводами, у команды uniq есть еще несколько опций, которых нет у команды sort.

Параметры uniq

Опция -c

—count

Сообщит, сколько было одинаковых строк до их урезания:

 echo -e кот\\nконь\\nсобака\\nкрыса\\nкрыса | uniq -c
 
     1 кот
     1 конь
     1 собака
     2 крыса

Опция -d

—repeated

Эта опция, наоборот, выведет лишь ту строку, которая повторялась в тексте:

 echo -e кот\\nконь\\nсобака\\nкрыса\\nкрыса | uniq -d
 
 крыса

Можно узнать и сколько раз эта строка повторялась:

 echo -e кот\\nконь\\nсобака\\nкрыса\\nкрыса | uniq -dc
    
      2 крыса

Опция -D (расширение GNU)

—all-repeated

Выведет все повторяющиеся строки, не уменьшая их числа:

 echo -e кот\\nконь\\nсобака\\nкрыса\\nкрыса | uniq -D
 
 крыса
 крыса

На первый взгляд, это не слишком полезно, но в сочетании с некоторыми другими опциями вполне имеет смысл.

Опция -u

—unique

Выводит только уникальные строки:

 echo -e кот\\nконь\\nсобака\\nкрыса\\nкрыса | uniq -u
 
 кот
 конь
 собака

Опция -f

—skip-fields=ЧИСЛО

-ЧИСЛО

Эта опция пропустит указанное ЧИСЛО «слов», прежде чем начать искать повторы. Тут следует пояснить, что «словом» команда uniq считает любую непрерывную последовательность символов, отделенную от других символов знаками пробела, либо табуляции (таковых знаков может быть один или больше).

 echo -e Иванов Сергей\\nИванов Михаил\\nИванов Иван\\nИванов Иван\\nИванов Константин | uniq -f 1
 
 Иванов Сергей
 Иванов Михаил
 Иванов Иван
 Иванов Константин

В этом примере мы пропустили заведомо одинаковую фамилию, чтобы «отцедить» двойников Иванов. (Правда, безо всяких опций сработало бы не хуже, но в каких-то случаях, скорее всего, эта опция полезна).

Можно скомбинировать эту опцию с другими, слегка изменив синтаксис:

 echo -e Иванов Сергей\\nИванов Михаил\\nИванов Иван\\nИванов Иван\\nИванов Константин | uniq -f1 -c
 
     1 Иванов Сергей
     1 Иванов Михаил
     2 Иванов Иван
     1 Иванов Константин

В таком виде она имеет определенный смысл.

Можно было задать эту опцию проще: uniq -1.

Опция -s

—skip-chars=ЧИСЛО

+ЧИСЛО

Эта опция пропустит необходимое ЧИСЛО символов, прежде начала поиска повторов.

 echo -e пивовар\\nмыловар\\nсыровар | uniq -s 4
 
 пивовар

Эту опцию можно комбинировать с другими, если записать без пробела между -s и ЧИСЛОМ:

 echo -e 111222\\n111333\\n111444 | uniq -s3 -c
   
     1 111222
     1 111333
     1 111444

Можно также ставить просто: uniq +3.

Опция -w

—check-chars=ЧИСЛО

Позволяет сравнивать на уникальность указанное ЧИСЛО символов в каждой строке:

 echo -e перестройка\\nпеределка\\nперестрелка | uniq -w4
 перестройка

Работает эта опция и в сочетании с опциями пропуска слов или символов:

 echo -e перестройка\\nпеределка\\nперестрелка | uniq -s2 -w2
 перестройка

Опции —help и —version общеизвестны, останавливаться на них мы не будем.

Остается добавить, что команда uniq принимает в качестве аргументов не только файлы, которые проверяются на уникальность, но и файлы, куда результат проверки будет записан:

 uniq имя_файла_входящего имя_файла_выходящего

Команда uniq и символы кириллицы

Новые версии программы с русскими буквами работают адекватно (версия 5.97 с некоторыми опциями неадекватно обращалась с кириллицей; версия 6.4 никаких нареканий не вызывает).

Резюме команды uniq

Сырая и не самая необходимая команда (несмотря на маститых авторов: Richard Stallman и David MacKenzie). Следует обновить до новейшей версии, так как в версии 5.97 замечены ошибки. Для отбраковки одинаковых строк советую, вместо команды uniq, применять команду sort -u.


Информация взята с open-club.ru

Команда uniq в LINUX с примерами

Команда uniq в Linux — это утилита командной строки, которая сообщает или отфильтровывает повторяющиеся строки в файле.
Проще говоря, uniq — это инструмент, который помогает обнаруживать соседние дубликаты строк, а также удаляет дубликаты строк. uniq отфильтровывает соседние совпадающие строки из входного файла (который требуется в качестве аргумента) и записывает отфильтрованные данные в выходной файл.

Синтаксис команды uniq:

 //...syntax of uniq...// 
$uniq [OPTION] [INPUT[OUTPUT]]

Синтаксис этого довольно прост для понимания. Здесь INPUT относится к входному файлу, в котором необходимо отфильтровать повторяющиеся строки, и если INPUT не указан, uniq читает из стандартного ввода. OUTPUT относится к выходному файлу, в котором вы можете сохранить отфильтрованный вывод, сгенерированный командой uniq, и, как в случае INPUT, если OUTPUT не указан, uniq записывает в стандартный вывод.

Теперь давайте разберемся в этом с помощью примера. Предположим, у вас есть текстовый файл с именем kt.txt, который содержит повторяющиеся строки, которые необходимо пропустить. Это можно просто сделать с помощью uniq.

//displaying contents of kt.txt//

$cat kt.txt
I love music.
I love music.
I love music.

I love music of Kartik.
I love music of Kartik.

Thanks.

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

//...using uniq command.../

$uniq kt.txt
I love music.

I love music of Kartik.

Thanks.

/* with the use of uniq all
the repeated lines are removed*/

Как вы можете видеть, мы просто использовали имя входного файла в приведенном выше примере uniq, и поскольку мы не использовали никакого выходного файла для хранения полученного вывода, команда uniq отображала отфильтрованный вывод на стандартном выводе со всеми повторяющимися строками. удален.

Примечание: uniq не может обнаружить дубликаты строк, если они не находятся рядом. Поэтому содержимое файла должно быть отсортировано перед использованием uniq, или вы можете просто использовать sort -u вместо f uniq.

Опции для команды uniq:

  1. -c — -count: сообщает, сколько раз строка повторялась, отображая число в виде префикса со строкой.
  2. -d — -repeated: печатает только повторяющиеся строки, а не строки, которые не повторяются.
  3. -D — -all-repeat [= METHOD]: он печатает все повторяющиеся строки, и METHOD может быть любым из следующих:
    • none: не разделяйте дублирующиеся строки вообще. Это по умолчанию.
    • prepend: вставьте пустую строку перед каждым набором дублированных строк.
    • Отдельно: вставьте пустую строку между каждым набором дублированных строк.
  4. -f N — -skip-fields (N): позволяет пропустить N полей (поле — это группа символов, разделенных пробелами) строки перед определением уникальности строки.
  5. -i — -ignore case: по умолчанию выполняемые сравнения чувствительны к регистру, но с помощью этой опции можно проводить сравнения без учета регистра.
  6. -s N — -skip-chars (N): он не сравнивает первые N символов каждой строки при определении уникальности. Это похоже на параметр -f, но оно пропускает отдельные символы, а не поля.
  7. -u — -unique: позволяет печатать только уникальные строки.
  8. -z — -zero-terminated: строка завершается нулевым байтом (NULL) вместо новой строки.
  9. -w N — -check-chars (N): сравнивает только N символов в строке.
  10. — — help: выводит справочное сообщение и завершает работу.
  11. — — версия: отображает информацию о версии и выход.

Примеры uniq с опциями

1. Использование опции -c: сообщает количество повторений строки.

//using uniq with -c//

$uniq -c kt.txt
3 I love music.
1
2 I love music of Kartik.
1
1 Thanks.

/*at the starting of each 
line its repeated number is
displayed*/
2. Using -d option : It only prints the repeated lines.

//using uniq with -d//

$uniq -d kt.txt
I love music.
I love music of Kartik.

/*it only displayed one
 duplicate line per group*/

3. Использование опции -D: она также печатает только дубликаты строк, но не по одной на группу.

//using -D option//

$uniq -D kt.txt
I love music.
I love music.
I love music.
I love music of Kartik.
I love music of Kartik.

/* all the duplicate lines 
are displayed*/

4. Использование опции -u: она печатает только уникальные строки.

//using -u option//

$uniq -u kt.txt
Thanks.

/*only unique lines are
displayed*/

5. Использование опции -f N: Как сказано выше, это позволяет пропускать N полей при сравнении уникальности строк. Эта опция полезна, когда строки пронумерованы, как показано в примере ниже:

//displaying contents of f1.txt//

$cat f1.txt
1. I love music.
2. I love music.
3. I love music of Kartik.
4. I love music of Kartik.

//now using uniq with -f N option//

$uniq -f 2 f1.txt
1. I love music.
3. I love music of Kartik.

/*2 is used cause we needed to
compare the lines after the
numbering 1,2.. and after dots*/

6. Использование опции -s N: аналогично опции -f N, но пропускает N символов, но не N полей.

//displaying content of f2.txt//

$cat f2.txt
#%@I love music.
^&(I love music.
*-!@thanks.
#%@!thanks.

//now using -s N option//

$uniq -s 3 f2.txt
#%@I love music.
*-!@thanks.
#%@!thanks.

/*lines same after skipping
3 characters are filtered*/

7. Используя опцию -w: аналогично способу пропуска символов, мы также можем попросить uniq ограничить сравнение заданным количеством символов. Для этого используется опция командной строки -w.

//displaying content of f3.txt//

$cat f3.txt
How it is possible?
How it can be done?
How to use it?

//now using -w option//

$uniq -w 3 f3.txt
How

/*as the first 3 characters
of all the 3 lines are same
that's why uniq treated all these
as duplicates and gave output 
accordingly*/

8. Использование опции -i: используется для сравнения без учета регистра.

//displaying contents of f4.txt//

$cat f4.txt
I LOVE MUSIC
i love music
THANKS

//using uniq command//
$uniq f4.txt
I LOVE MUSIC
i love music
THANKS

/*the lines aren't treated
as duplicates with simple 
use of uniq*/

//now using -i option//

$uniq -i f4.txt
I LOVE MUSIC
THANKS

/*now second line is removed
when -i option is used*/

9. Используя опцию -z: по умолчанию вывод uniq завершается новой строкой. Однако, если вы хотите, вы хотите иметь вывод с завершением NULL вместо этого (полезно при работе с uniq в скриптах). Это можно сделать с помощью параметра командной строки -z.

Синтаксис:

//syntax of using uniq
with -z option//

$uniq -z file-name

Рекомендуемые посты:

Команда uniq в LINUX с примерами

0.00 (0%) 0 votes

Команды фильтрации в Linux. head, tail, sort, nl, wc, cut, sed, uniq, tac

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

Фильтры в Linux

Фильтры — это способ получения необработанных данных, созданных другой программой или сохраненных в файле.

Эти фильтры имеют различные параметры командной строки, которые изменяют их поведение. В результате, всегда полезно проверить страницу руководства для фильтра.

В приведенных ниже примерах мы будем предоставлять данные для этих программ с помощью файла.

Для каждой из демонстраций ниже будет использоваться следующий файл в качестве примера. Этот файл примера содержит список содержимого, чтобы немного облегчить понимание примеров. Кроме того, файл фактически указан как путь, и поэтому вы можете использовать абсолютные и относительные пути, а также подстановочные знаки.

СКРИН

head

Head — это программа, которая печатает первые строки ввода. По умолчанию он напечатает первые 10 строк, но мы можем изменить это с помощью аргумента командной строки.

head [-количество строк для печати] [путь]

tail

Данная команда противоположна head. Tail — это команда, которая печатает последние строки ввода. По умолчанию он напечатает последние 10 строк, но мы можем изменить это с помощью аргумента командной строки.

tail [-количество строк для печати] [путь]

Выше было поведение tail по умолчанию. А ниже указывается заданное количество строк.

sort

Сортировка — это красиво и просто. По умолчанию сортировка выполняется в алфавитном порядке. Между тем, существует множество параметров, позволяющих изменить механизм сортировки. Кроме того, не забудьте проверить справочную страницу, чтобы увидеть все, что он может сделать.

sort [-options] [path]

nl

Обозначение чисел в Linux реализуется за счет команды nl.

nl [-options] [путь]

Вот еще несколько полезных опций командной строки.

В приведенном выше примере мы использовали 2 параметра командной строки. Первый -s указывает, что следует печатать после числа. С другой стороны, второй -w указывает, сколько отступов ставить перед числами. Для первого нам нужно было включить пробел как часть того, что было напечатано.

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

wc

wc обозначает количество слов, а также символы и строки. По умолчанию он подсчитывает все вышеперечисленное. Между тем, используя параметры командной строки, мы можем ограничить его только тем, что нам нужно.

wc [-options] [путь]

Иногда вам просто нужно одно из этих значений. -l даст нам только строки, -w даст нам слова, а -m даст нам символы.

Кроме того, Вы можете комбинировать аргументы командной строки.

cut

Cut — это хорошая команда, которую можно использовать, если ваш контент разделен на столбцы и вам нужны только определенные поля.

вырезать [-опции] [путь]

В нашем примере файла у нас есть данные в 3 столбцах. Допустим, мы хотели только первый столбец.

По умолчанию cut использует символ TAB в качестве разделителя для идентификации полей. Опция -f позволяет нам указать, какое поле мы бы хотели. Если нам нужно 2 или более полей, мы разделяем их запятой, как показано ниже.

sed

Sed расшифровывается как Stream Editor и позволяет эффективно выполнять поиск и замену наших данных. Это довольно мощная команда, но мы будем использовать ее здесь в ее базовом формате.

sed <выражение> [путь]

Инициал s обозначает замену и определяет действие, которое нужно выполнить. Между первой и второй косой чертой (/) мы размещаем то, что ищем. Затем между вторым и третьим слэшем, чем мы хотим его заменить.

uniq

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

uniq [опции] [путь]

tac

Ребята из Linux известны своим забавным чувством юмора. Программа TAC на самом деле является CAT наоборот. Это было названо так, как это делает противоположность CAT. Получив данные, он напечатает последнюю строку первой, вплоть до первой строки.

TAC [путь]

Вывод

В данной статье мы ознакомились со следующими командами:

  • head — просмотр первых n строк данных.
  • tail — просмотр последних n строк данных.
  • sort — организуйте данные в порядке.
  • nl — напечатайте номера строк перед данными.
  • wc — распечатать количество строк, слов и символов.
  • cut — разрезать данные на поля и отображать только указанные поля.
  • sed — сделайте поиск и замените данные.
  • uniq — удалить дубликаты строк.
  • tac — распечатайте данные в обратном порядке.

Команда Bash uniq — Подсказка для Linux

Пользователям Linux необходимо регулярно создавать или читать текстовые файлы для многих целей. Текстовый файл может содержать различные типы числовых и символьных данных. Одни и те же данные могут быть сохранены в текстовом файле несколько раз. Иногда вам может потребоваться прочитать любой текстовый файл, пропустив повторяющиеся строки данных. Команда Bash uniq — это полезный служебный инструмент командной строки, который используется для чтения текстового файла путем фильтрации или удаления смежных повторяющихся строк из текстового файла. uniq Команда используется для обнаружения соседних строк из файла и записи содержимого файла путем фильтрации повторяющихся значений или записи только повторяющихся строк в другой файл.

uniq [ОПЦИЯ] [ВХОД [ВЫХОД]]

Здесь OPTION, INPUT и OUTPUT являются необязательными. Если вы используете только команду uniq без какой-либо опции или имени файла ввода / вывода, эта команда будет применяться к стандартным входным данным. С этой командой можно использовать множество типов параметров для фильтрации повторяющихся данных различными способами из любого текстового файла.Если вы используете имя входного файла с этой командой, данные будут отфильтрованы из этого файла. Если вы выполняете команду с опцией, входным именем и выходным именем, тогда данные будут отфильтрованы из входного файла на основе параметра и записать выходные данные в выходной файл.

Опции:

Некоторые основные параметры команды uniq обсуждаются ниже.

Используется для пропуска N полей перед обнаружением уникальности данных. Поля — это группа символов, разделенных пробелом или табуляцией.

Используется для пропуска N символов перед обнаружением уникальности данных.

Используется для сравнения N символов только в строке.

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

Используется для завершения строки 0 байтами вместо использования новой строки.

Используется для печати только всех повторяющихся строк.

  • -D или –все повторяется [= МЕТОД]

Используется для печати всех повторяющихся строк в зависимости от используемого метода.С этой опцией можно использовать следующие методы.

нет: это метод по умолчанию, он не разделяет повторяющиеся строки.
prepend: добавляет пустую строку перед каждым набором повторяющихся строк.
отдельно: между двумя повторяющимися строками добавляется пустая строка.

Используется только для печати уникальных строк.

Используется для сравнения без учета регистра.

Примеры команды uniq

Создайте текстовый файл с именем uniq_test.txt со следующим содержимым:

Bash-программирование
Bash-программирование
Python-программирование
Мне нравится PHP-программирование
Мне нравится Java-программирование

Пример №1: Использование опции -f

Следующая команда применит команду uniq , пропуская первые два поля каждой строки из uniq_test.txt файл.

$ uniq -f 2 uniq_test.txt

Пример № 2: Использование опции -s

Следующая команда применит команду uniq , пропуская 4 символа из каждой строки файла uniq_test.txt .

$ uniq -s 4 uniq_test.txt

Пример № 3: Использование опции –w

Следующая команда применит команду uniq , сравнивая первые два символа каждой строки.

$ uniq -w 2 uniq_test.txt

Пример №4: Использование опции –c

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

Пример № 5: Использование опции –d

Следующая команда отображает только те строки из файла, которые несколько раз встречались в файле. В uniq_test два раза появлялась только одна строка.txt, который отображается как вывод.

Пример № 6: Использование опции –D

Следующая команда распечатает все повторяющиеся строки из файла.

Пример № 7: Использование опции –all-repeat с методом добавления

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

$ uniq —all-duplicate = добавить uniq_test.txt

Пример № 8: Использование опции –u

Следующая команда найдет все уникальные строки из файла. В файле uniq_test.txt есть три уникальные строки, которые выводятся на печать.

Заключение

Использование команды uniq объясняется и демонстрируется на различных примерах в этом руководстве. Надеюсь, после прочтения этого руководства вы сможете правильно использовать команду uniq.

.Справочная страница

uniq — Справочная страница Linux

uniq — Linux — SS64.com

Сообщить или отфильтровать повторяющиеся строки в файле.
Читает стандартный ввод, сравнивая соседние строки, и записывает копию каждой уникальной
строка ввода на стандартный вывод.
Вторая и последующие копии идентичных
соседние строки ввода не записываются.

 Синтаксис
      uniq [ options ] ... [ InputFile  [ OutputFile ]]

Параметры

   -  N 
   -f  N 
   --skip-fields =  N 
       Перед проверкой уникальности пропустите поля  N  в каждой строке.Поля
       представляют собой последовательности непробельных символов табуляции, разделенных
       друг от друга хотя бы на один пробел или табуляцию.

   +  N 
   -s N
   --skip-chars =  N 
       Перед проверкой уникальности пропустите N символов. Если вы используете оба
       параметры пропуска полей и символов, поля пропускаются
       первый.

   -c
   --count
       Выведите, сколько раз каждая строка встречалась вместе со строкой.-я
   --ignore-case
       Игнорировать различия при сравнении строк.

   -d
   - повторяется
       Печатайте только повторяющиеся строки.

   -D
   - все повторяется
       Распечатайте все повторяющиеся строки и только повторяющиеся строки. Этот вариант
       полезно в основном в сочетании с другими параметрами, например, чтобы игнорировать
       case или для сравнения только выбранных полей. Это расширение GNU.

   -u
   --уникальный
       Не выводите строки, которые повторяются во входных данных.Печатайте только строки, которые уникальны в INPUT.

   -w  N 
   --check-chars =  N 
       Сравните  N  символов в каждой строке
       (после пропуска любых указанных полей и символов).
       По умолчанию сравниваются все остальные строки. 

По умолчанию uniq печатает уникальные строки в отсортированном файле,
отбрасывает все идентичные последовательные входные строки, кроме одной. так что ВЫХОД содержит уникальные строки.

uniq будет сравнивать только строки, которые появляются на входе последовательно .

Повторяющиеся строки во вводе не будут
обнаруживается, если они не находятся рядом, поэтому может потребоваться отсортировать файлы
первый.

Если для InputFile задано значение — (или ничего), то uniq будет читать из стандартного ввода.

Если файл OutputFile не указан, uniq выполняет запись в стандартный вывод.

Примеры

Распечатайте демонстрационный файл.txt без дублирования строк:

$ сортировать demo.txt | uniq

Вывести только уникальные числа из входных 1, 1, 2, 3

$ printf «% s \ n» 1 1 2 3 | uniq -u
2
3

Подсчитайте частоту некоторых слов:

эхо «раз, два, три, один, три» | tr -cs «A-Za-z» «\ n» | сортировать | uniq -c | sort -n -r

«Уникальный комплекс, необыкновенная и незаменимая Диана, красота которой, как внутренняя, так и внешняя, никогда не исчезнет из нашей памяти» ~ Эрл Спенсер

Связанные команды linux:

sort -u — Сортировка текстовых файлов для поиска уникальных строк.
tr — перевод, сжатие и / или удаление символов.


Авторские права © 1999-2020 SS64.com
Некоторые права защищены.

unix — Выбор уникальных строк на основе двух столбцов

Переполнение стека

  1. Около
  2. Продукты

  3. Для команд
  1. Переполнение стека
    Общественные вопросы и ответы

  2. Переполнение стека для команд
    Где разработчики и технологи делятся частными знаниями с коллегами

  3. Вакансии
    Программирование и связанные с ним технические возможности карьерного роста

  4. Талант
    Нанимайте технических специалистов и создавайте свой бренд работодателя

  5. Реклама
    Обратитесь к разработчикам и технологам со всего мира

  6. О компании

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *