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, команда имеет всего три опции и они представлены не буквами, как обычно, а цифрами:
Резюме команды commТрудно представить себе, чтобы этой командой можно было пользоваться для реального сравнения двух файлов. Ведь файлы придется сначала сортировать при помощи команды sort, а потом разбираться в трех колонках вывода, что вовсе не просто, если в строке содержится хотя бы несколько слов. Можно применять ее в каких-либо скриптах, либо для сравнения проверяемого файла с эталонным, отключая те или иные колонки вывода при помощи опций. Например, если у вас есть файл file-dict.txt со всеми словами английского языка (из какого-либо словаря), то вы можете сравнить написание сомнительного слова с этим файлом, отключив колонки 2 и 3 при помощи соответствующих опций:
$ echo WORD | comm -23 - file-dict.txt Если в выводе ничего нет, то слово WORD написано правильно, а если есть само слово WORD, значит оно написано неверно (либо его нет в эталонном файле file-dict.txt). Подозреваю, что данная команда была написана товарищами Столлменом и Маккензи именно для этих функций своего Emacs'а.
|