Як використовувати команду uniq в Linux

Інструмент командного рядка Linux uniq аналізує текстові файли, виявляючи рядки, що повторюються або є унікальними. Цей посібник розкриє вам усі можливості та тонкощі цієї потужної утиліти, показуючи, як ефективно використовувати її у своїй роботі.

Аналіз рядків тексту за допомогою команди uniq в Linux

Команда uniq – це ефективний, гнучкий та точний інструмент. Проте, як і більшість команд Linux, вона має свої особливості, які потрібно знати для ефективного використання. Без розуміння цих нюансів, ви можете зіткнутися з несподіваними результатами. Ми будемо акцентувати увагу на цих особливостях протягом нашого огляду.

uniq чудово підходить для виконання конкретних задач. Вона особливо корисна при роботі з конвеєрами команд, де вона відіграє важливу роль. Одним з її найчастіших партнерів є команда sort, оскільки uniq вимагає відсортованих вхідних даних для правильної роботи.

Отже, давайте розпочнемо!

Запуск команди uniq без параметрів

У нас є текстовий файл, що містить текст пісні Роберта Джонсона під назвою “Я вірю, що я змахну свою мітлу”. Подивимось, як uniq працює з цим файлом.

Щоб передати вивід команди в less, введіть наступне:

uniq dust-my-broom.txt | less

Результат – весь текст пісні, включаючи рядки, що повторюються.

На перший погляд, це не відображення унікальних або повторюваних рядків.

Саме тут виявляється перша особливість uniq. Без вказання параметрів, вона працює так, ніби ви використовуєте опцію -u (унікальні рядки), тобто показує лише унікальні рядки з файлу. Причина, чому ви бачите повторювані рядки, полягає в тому, що uniq розпізнає дублікати тільки якщо вони є сусідніми. Ось тут і потрібне сортування.

Сортуючи файл, ми групуємо повторювані рядки, що дозволяє uniq ідентифікувати їх як дублікати. Використаємо sort для сортування, передамо результат uniq, а потім виведемо все це через less.

Для цього введіть:

sort dust-my-broom.txt | uniq | less

Тепер у less відображено відсортований список рядків.

Рядок “Я вірю, що я змахну свою мітлу” дійсно неодноразово зустрічається в пісні. Насправді, він повторюється двічі в перших чотирьох рядках.

Чому ж він з’явився у списку унікальних рядків? Тому що перше входження рядка у файлі є унікальним, а всі наступні входження вважаються дублікатами. Іншими словами, uniq показує перше входження кожного унікального рядка.

Давайте ще раз використаємо sort і перенаправимо вивід в новий файл, щоб не сортувати файл при кожному запуску команди.

Введіть команду:

sort dust-my-broom.txt > sorted.txt

Тепер у нас є попередньо відсортований файл для подальшої роботи.

Підрахунок дублікатів

За допомогою параметра -c (лічильник) ви можете вивести кількість разів, коли кожен рядок з’являється у файлі.

Введіть:

uniq -c sorted.txt | less

Кожен рядок починається з числа, що показує кількість його повторень у файлі. Зверніть увагу, що перший рядок є порожнім. Це означає, що у файлі є п’ять порожніх рядків.

Щоб відсортувати вихідні дані за кількістю повторень, можна передати вивід uniq команді sort з параметрами -r (зворотній порядок) та -n (числове сортування), а потім вивести результат через less.

Введіть:

uniq -c sorted.txt | sort -rn | less

Тепер список відсортовано в порядку спадання за частотою появи кожного рядка.

Виведення лише рядків, що повторюються

Якщо вам потрібні лише рядки, які зустрічаються у файлі більше одного разу, використовуйте параметр -d (повторення). Незалежно від кількості дублікатів рядка, він буде виведений лише один раз.

Щоб скористатись цією опцією, введіть:

uniq -d sorted.txt

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

Можна об’єднати параметри -d (повторення) і -c (підрахунок) та відсортувати результат. Це дасть нам відсортований список рядків, що з’являються хоча б двічі.

Введіть команду:

uniq -d -c sorted.txt | sort -rn

Виведення всіх рядків, що повторюються

Якщо потрібно вивести кожен рядок, що повторюється, та кожне його входження у файлі, використовуйте параметр -D (всі повторювані рядки).

Введіть:

uniq -D sorted.txt | less

Результатом буде список, де кожен повторюваний рядок виводиться стільки разів, скільки він зустрічається у файлі.

За допомогою параметра --group можна вивести кожен дублікат рядка з порожнім рядком перед (prepend), після (append) або і перед, і після (both) кожної групи.

Використаємо append, для цього введіть:

uniq --group=append sorted.txt | less

Групи розділені порожніми рядками для зручнішого читання.

Перевірка певної кількості символів

За замовчуванням uniq перевіряє весь рядок. Щоб обмежити перевірку певною кількістю символів, використовуйте параметр -w (кількість символів для перевірки).

Повторимо останню команду, але обмежимо порівняння першими трьома символами. Для цього введіть:

uniq -w 3 --group=append sorted.txt | less

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

Усі рядки, що починаються з “I b”, згруповані разом, оскільки ця їхня частина ідентична і розглядається як повторення.

Аналогічно, всі рядки, що починаються з “Я”, вважаються повторюваними, навіть якщо решта тексту різниться.

Ігнорування певної кількості символів

Іноді корисно пропускати певну кількість символів на початку кожного рядка. Наприклад, коли рядки у файлі пронумеровані. Або, скажімо, потрібно, щоб uniq почав перевірку рядка з шостого символу, ігноруючи перші п’ять символів.

Нижче показано наш відсортований файл із пронумерованими рядками.

Щоб uniq почав перевірку з третього символу, використаємо параметр -s (пропустити символи), ввівши:

uniq -s 3 -d -c numbered.txt

Рядки визначені як повторювані, і їхні входження підраховано правильно. Зверніть увагу, що номери рядків відображають номери першого входження кожного дубліката.

Також можна пропускати поля (набір символів і пробілів) замість символів. Використаємо параметр -f (поля), щоб вказати uniq, які поля ігнорувати.

Щоб uniq ігнорував перше поле, введіть:

uniq -f 1 -d -c numbered.txt

Ми отримали ті самі результати, що й коли сказали uniq пропускати три символи на початку кожного рядка.

Ігнорування регістру

За замовчуванням uniq розрізняє регістр. Рядки, що відрізняються лише регістром букв, вважаються різними.

Наприклад, розглянемо результат наступної команди:

uniq -d -c sorted.txt | sort -rn

Рядки “Я вірю, що я змахну свою мітлу” та “Я вірю, що притрушу свою мітлу” не розглядаються як повторювані через різницю в регістрі букви “В” у слові “вірю”.

Проте, якщо ми використаємо параметр -i (ігнорувати регістр), ці рядки будуть вважатися повторюваними. Введіть:

uniq -d -c -i sorted.txt | sort -rn

Тепер рядки розглядаються як повторювані і згруповані.

Linux пропонує безліч спеціальних утиліт. uniq, як і багато з них, не є інструментом щоденного використання.

Саме тому досвід роботи з Linux полягає у вмінні запам’ятовувати, який інструмент вирішить поточну проблему та де його можна знайти. Якщо ви будете практикуватися, то досягнете успіху.

Або ж ви завжди можете звернутися до нашого сайту, де, можливо, є стаття на цю тему.