Команда comm у системах Linux може порівнювати вміст файлів або каталогів і відображати відмінності у зрозумілий і зручний спосіб. Думайте про «comm» не стільки як про «compare», скільки як про «common», оскільки команда записує у стандартний вивід як рядки, які є загальними, так і рядки, які є унікальними в кожному з файлів або каталогів.
Однією з ключових вимог під час використання comm є те, що вміст, який порівнюється, має бути відсортованим. Однак є способи уникнути порівняння невідсортованого вмісту. Деякі приклади того, як це зробити, наведені у публікації Network World.
Порівняння файлів
Зазвичай, використовуючи команду comm, ви порівнюєте два відсортовані текстові файли, щоб побачити їхні спільні й унікальні рядки. Ось приклад порівняння списку друзів і списку сусідів.
$ comm friends neighbors
Alice
Betty
Christopher
Diane
George
Patty
Ricky
Sam
Tim
Zelda
Зверніть увагу, що вихідні дані відображаються у трьох стовпцях. Перший охоплює імена, які включені лише у перший файл. Другий показує імена, які включені лише у другий файл. Третій показує загальні назви.
ПРИМІТКА. Якщо один із файлів не було відсортовано, ви побачите щось подібне до цього:
$ comm friends neighbors
Alice
Betty
Christopher
Diane
Patty
comm: file 1 is not in sorted order <==
George
Ricky
Sam
Tim
Zelda
comm: input is not in sorted order <==
Однак вирішити цю проблему можна, фактично не змінюючи порядок сортування самих файлів. Замість цього ви можете сортувати файли під час виконання команди comm, як у наведеному нижче прикладі:
$ comm <(sort friends) <(sort neighbors)
Alice
Betty
Christopher
Diane
George
Patty
Ricky
Sam
Tim
Zelda
Якщо ви хочете бачити лише вміст, спільний для порівнюваних файлів, то можете приховати відображення перших двох стовпців за допомогою такої команди:
$ comm -12 friends neighbors
Diane
Patty
Tim
«12» означає «приховати стовпець 1 і стовпець 2». Таким чином можна приховати будь-який зі стовпців.
У наведеній нижче команді приховано лише третій стовпець. У результаті ви побачите імена, які є унікальними для кожного файлу, але не ті, що включені в обидва файли.
$ comm -3 friends neighbors
Alice
Betty
Christopher
George
Ricky
Sam
Zelda
Якщо ви хочете порівняти файли, які можуть бути не відсортовані, то можете використати параметр --nocheck-order.
$ comm --nocheck-order friends neighbors
Alice
Betty
Christopher
Diane
George
Patty
Ricky
Sam
Tim
Zelda
Tim
Щоб команда comm підрахувала кількість рядків у кожному стовпці, додайте опцію -- total, як показано нижче.
$ comm --total friends neighbors
Alice
Betty
Christopher
Diane
George
Patty
Ricky
Sam
Tim
Zelda
6 1 3 total
Щоб використовувати розділові знаки, відмінні від вкладок, які за замовчуванням відокремлюють стовпці, скористайтеся параметром output-delimiter -, як показано у прикладі нижче. Рядки нижче без символів «:» є записами першого стовпця (лише в першому файлі). Ті, що починаються з одного «:», є іменами другого стовпця (лише у другому файлі). Рядки нижче, які починаються з «::», є іменами третього стовпця (містяться в обох файлах). Це може спростити імпорт результатів в електронну таблицю.
$ comm --output-delimiter=: friends neighbors
Alice
Betty
Christopher
::Diane
George
::Patty
Ricky
Sam
::Tim
:Zelda
Порівняння каталогів
Під час порівняння вмісту каталогу вам потрібно використовувати техніку, подібну до тієї, що була показана раніше для порівняння несортованих файлів шляхом сортування їхнього вмісту у процесі порівняння, щоб отримати список файлів. У цьому прикладі вміст двох каталогів перераховується перед порівнянням.
$ comm <(ls dir1) <(ls dir2)
file1
file2
file3
У наведеному вище прикладі єдиним файлом, який є спільним для обох каталогів, є file3.
Однак зауважте, що щойно показана команда comm порівнює лише імена файлів. Він не порівнює вміст файлу.
Додавання заголовків
Якщо ви хочете додати заголовки стовпців до виводу comm, то можете помістити як команду echo, так і команду comm, яку потрібно виконати, у файл сценарію. Хоча заголовки не обов’язково будуть точно узгоджуватися зі вмістом, який порівнюється, вони все одно можуть бути корисними. Ось приклад сценарію:
#!/bin/bash
echo -e "friends\tneighbors both"
echo "======= ========= ===="
comm friends neighbors
Це приклад виведення зі сценарію:
$ compare
friends neighbors both
======= ========= ====
Alice
Betty
Christopher
Diane
George
Patty
Ricky
Sam
Tim
Zelda
Команда comm дає змогу досить легко порівнювати вміст текстових файлів, навіть якщо вони не відсортовані спочатку. Це також дозволяє порівнювати імена файлів у двох каталогах.
Читайте інші лайфхаки у ProIT:
Лайфхаки: як увімкнути приховані функції Windows 11 за допомогою Microsoft StagingTool.
Лайфхаки для навігації у файловій системі Linux.
Підписуйтеся на ProIT у Telegram, щоб не пропустити жодну публікацію!