Comm
Описание
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