Comm

Материал из Ай да Linux Wiki
Перейти к навигации Перейти к поиску

Описание

comm — утилита unix, читает файл1 и файл2, которые должны быть предварительно лексически отсортированы, и генерирует вывод, состоящий из трёх колонок текста: строки, найденные только в файле файл1; строки, найденные только в файле файл2; и строки, общие для обоих файлов. Имя файла «-» означает стандартный ввод. Перед каждой колонкой будет напечатано столько символов табуляции, сколько печатается колонок с меньшими номерами. Например, если вывод второй колонки подавляется, то перед строками, печатаемыми в первой колонке, символов табуляции не будет совсем, а перед строками в третьей колонке будет напечатан один символ табуляции.

Утилита 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'а.



Информация взята с open-club.ru