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'а.

 


счетчик посещений

 

Система Orphus

Hosted by uCoz