Библиотека сайта rus-linux.net
HuMan: comm
Алексей Дмитриев, 14 февраля 2009Команда comm служит для построчного сравнения содержимого двух отсортированных файлов.
Составим два файла: aguty.txt и zay.txt:
$ cat aguty.txt агути заяц кошка собака ящерица
$ cat zay.txt заяц кошка мышь собака ящерица
Обратите внимание, что слова в обоих файлах рассортированы в алфавитном порядке.
Теперь сравним их при помощи команды comm:
$ comm aguty.txt zay.txt агути заяц кошка мышь собака ящерица
Мы увидим три колонки, разделенные табуляцией. В первой колонке собраны слова, уникальные для первого файла; во второй колонке - уникальные для второго файла; в третьей колонке собраны слова общие для двух файлов.
Однако стоит нам изменить порядок слов в одном из файлов, хотя бы заменив его на обратный алфавитному при помощи команды sort:
$ sort -r zay.txt ящерица собака мышь кошка заяц
Как команда comm уже не справляется со своей задачей:
$ sort -r zay.txt | comm - aguty.txt агути заяц кошка собака ящерица собака мышь кошка заяц
Результат, как видите, совершенно нелеп и непредсказуем. В самом деле, в первой колонке уникальными для первого файла признаны все слова, кроме, почему-то, ящерицы. Во второй то же самое. А та же ящерица признана единственным общим словом для двух файлов (третья колонка). И дело тут не в том, что я пользовался русскими словами, с английскими было бы то же самое. Вывод: лучше не пытаться применять команду comm к несортированным файлам.
Поясню конструкцию в командной строке последнего примера. Я применил программный канал из двух команд. Оператором программного канала служит вертикальная черта (|). Стандартный вывод команды sort -r zay.txt
направляется на стандартный ввод команде comm
. В аргументе команды comm, вместо первого файла прочерк, что заставляет ее принять стандартный ввод вместо файла.
Опции команды comm
Кроме общеизвестных --help и --version, команда имеет всего три опции и они представлены не буквами, как обычно, а цифрами:- Опция -1 Подавляет вывод первой колонки (строк, уникальных для первого файла)
- Опция -2 Подавляет вывод второй колонки (строк, уникальных для второго файла)
- Опция -3 Подавляет вывод третьей колонки (строк, общих для двух файлов)
Резюме команды comm
Трудно представить себе, чтобы этой командой можно было пользоваться для реального сравнения двух файлов. Ведь файлы придется сначала сортировать при помощи команды sort, а потом разбираться в трех колонках вывода, что вовсе не просто, если в строке содержится хотя бы несколько слов. Можно применять ее в каких-либо скриптах, либо для сравнения проверяемого файла с эталонным, отключая те или иные колонки вывода при помощи опций. Например, если у вас есть файл file-dict.txt со всеми словами английского языка (из какого-либо словаря), то вы можете сравнить написание сомнительного слова с этим файлом, отключив колонки 2 и 3 при помощи соответствующих опций:
$ echo WORD | comm -23 - file-dict.txt
Если в выводе ничего нет, то слово WORD написано правильно, а если есть само слово WORD, значит оно написано неверно (либо его нет в эталонном файле file-dict.txt).
Подозреваю, что данная команда была написана товарищами Столлменом и Маккензи именно для этих функций своего Emacs'а.
Приложение
Список статей цикла HuMan:- "Перенаправление стандартных потоков данных в Linux"
- "HuMan: uniq"
- "HuMan: wc"
- "HuMan: sed"
- "HuMan: grep"
- "HuMan: sort"
- "HuMan: tr"
- "HuMan: cut"
- "dd: Команда, которая не похожа на другие"