В Linux команда comm
сравнивает два файла, выводя содержимое в три столбца: несовпадающие строки первого и второго файла, совпадающие — обоих файлов.
Содержание
Синтаксис
comm [ПАРАМЕТР] ФАЙЛ1 ФАЙЛ2
Опции
- -1
- Не показывать столбец 1 (строки, уникальные для ФАЙЛА1)
- -2
- Не показывать столбец 2 (строки, уникальные для ФАЙЛА2)
- -3
- Не показывать столбец 3 (строки, встреченные в обоих файлах)
- --check-order
- Проверить правильность сортировки ввода, даже если все входные строки имеют пару
- --nocheck-orde
- Не проверять правильность сортировки ввода
- --output-delimiter=РАЗ
- Отделять столбцы с помощью РАЗделителя
- --total
- Показывать сводку
- -z, --zero-terminated
- Разделитель строк
NUL
, а не символ новой строки
Заметим, что при сравнении действуют правила, задаваемые LC_COLLATE
.
Использование команды comm в Linux
Строки в сравниваемых файлах должны быть отсортированы по алфавиту. Для этого можно воспользоваться, например, командой sort
:
oleg@mobile:~/Directory:$ sort -o usa-states-ru_1.txt usa-states-ru_1.txt
oleg@mobile:~/Directory:$
Для проверки того, что входные файлы отсортированы используется опция --check-order
:
oleg@mobile:~/Directory:$ comm --check-order usa-states-ru_1.txt usa-states-ru_2.txt
Если один из файлов не отсортирован, то вместо нормального вывода появится сообщение об ошибке.
Если вы по каким-либо причинам не желаете выполнять сортировку, то для того, чтобы не получать сообщение об ошибке используйте опцию --nocheck-order
.
Для примера воспользуемся двумя файлами, в каждом из которых находится отсортированный по алфавиту список 10 штатов США:
oleg@mobile:~/Directory:$ cat usa-states-ru_1.txt
Айдахо (ID)
Айова (IA)
Алабама (AL)
Аляска (AK)
Аризона (AZ)
Арканзас (AR)
Вайоминг (WY)
Вашингтон (WA)
Вермонт (VT)
Вирджиния (VA)
oleg@mobile:~/Directory:$
oleg@mobile:~/Directory:$ cat usa-states-ru_2.txt
Алабама (AL)
Аляска (AK)
Аризона (AZ)
Арканзас (AR)
Вайоминг (WY)
Вашингтон (WA)
Вермонт (VT)
Вирджиния (VA)
Висконсин (WI)
Гавайи (HI)
oleg@mobile:~/Directory:$
Сравнение без параметров
Проводим сравнение двух файлов без использования опций:
oleg@mobile:~/Directory:$ comm usa-states-ru_1.txt usa-states-ru_2.txt
Айдахо (ID)
Айова (IA)
Алабама (AL)
Аляска (AK)
Аризона (AZ)
Арканзас (AR)
Вайоминг (WY)
Вашингтон (WA)
Вермонт (VT)
Вирджиния (VA)
Висконсин (WI)
Гавайи (HI)
oleg@mobile:~/Directory:$
- Первый столбец
- Несовпадающие элементы первого файла
- Второй столбец
- Несовпадающие элементы второго файла
- Третий столбец
- Совпадающие элементы обоих файлов
Отображение одного столбца
Для вывода одного столбца необходимо указать номера столбцов, которые не должны отображаться.
Вывод уникальных строк первого файла:
oleg@mobile:~/Directory:$ comm -23 usa-states-ru_1.txt usa-states-ru_2.txt
Айдахо (ID)
Айова (IA)
oleg@mobile:~/Directory:$
Вывод уникальных строк второго файла:
oleg@mobile:~/Directory:$ comm -13 usa-states-ru_1.txt usa-states-ru_2.txt
Висконсин (WI)
Гавайи (HI)
oleg@mobile:~/Directory:$
Заключение
Здесь были приведены лишь основные приёмы работы с командой comm
в Linux. Разобрав примеры вы быстро поймёте, что выполнять любые варианты сортировки файлов при их сравнении достаточно просто.