Как найти общие и уникальные строки файлов через comm в Linux

Как найти общие и уникальные строки файлов через comm в Linux
Содержание статьи

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

Готовим входные данные с одинаковой сортировкой

Пусть в old.txt находятся строки alpha и beta, а в new.txt находятся alpha и gamma. Подготовим отдельные отсортированные файлы, сохранив исходные.

LC_ALL=C sort -u old.txt > old.sorted
LC_ALL=C sort -u new.txt > new.sorted

sort -u сортирует строки и оставляет по одному экземпляру каждой. Это подходит для поставленной задачи сравнения множеств. Если количество повторов несёт смысл, такое удаление дублей приведёт к потере информации и требует другого решения.

Одинаковое LC_ALL=C задаём и при подготовке, и при сравнении. Правила сортировки comm зависят от локали. Файлы, упорядоченные по разным правилам, нельзя считать корректно подготовленной парой.

Получаем нужную часть результата

LC_ALL=C comm -12 old.sorted new.sorted
# alpha

LC_ALL=C comm -23 old.sorted new.sorted
# beta

LC_ALL=C comm -13 old.sorted new.sorted
# gamma

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

Поэтому -12 оставляет общие строки, -23 оставляет строки только первого файла, а -13 оставляет строки только второго. Такой способ чтения параметров помогает избежать перестановки смысла «старые» и «новые».

Проверяем порядок, а не отключаем проверку

LC_ALL=C comm --check-order -12 old.sorted new.sorted

GNU comm с --check-order проверяет порядок входных данных. Нарушение сортировки следует исправить при подготовке файлов. Отключение проверки не делает неотсортированные файлы пригодными для сравнения.

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

Задание на границы

Добавьте пустой файл и повтор одной строки. Проверьте, как подготовка с sort -u меняет задачу. Затем добавьте строки с разным регистром и объясните, должны ли они считаться одним элементом по требованиям.

Работу с текстовыми утилитами можно включить в практическое обучение DevOps. Подготовку и проверку файлов разберите с ментором по DevOps.

Похожие статьи по данной теме