Главная » Программирование для UNIX » Другие фильтры UNIX

0

Цель этого раздела – познакомить читателя с богатым набором фильтров,  поставляемых  с  системой, и показать на  примерах, как они  используются. Этот список ни в коем случае не претендует на полноту – в составе  седьмой версии есть  много  других фильтров, а в каждой уста новленной системе со временем появляются собственные реализации. Все стандартные фильтры описаны в первом разделе руководства.

Начнем с программы sort, возможно, наиболее полезной из  всех. Основные сведения о ней были  приведены в главе 1: программа сортирует поступающие на вход  строки по значениям кодов  ASCII-символов. Кроме этого  очевидного действия, выполняемого по умолчанию, есть множество других способов  сортировки, для каждого из которых sort имеет  соответствующий параметр. Например,  параметр –f  вызывает

«свертку» нижнего и верхнего регистров, так что различия между ними  игнорируются. Параметр –d (словарный порядок) игнорирует при  сравнении любые символы, кроме букв, цифр и пробелов.

Чаще всего выполняется сравнение по символам, но иногда требуется сравнивать числа. Параметр –n обеспечивает сортировку по числовым значениям, а параметр –r изменяет результат операции сравнения на противоположный. Таким образом,

$ ls | sort –f             Сортирует файлы в алфавитном порядке

$ ls –s  | sort –n       Сортирует файлы по возрастанию размера

$ ls –s  | sort –nr     Сортирует файлы по убыванию размера

По умолчанию sort сравнивает строки целиком, но ей можно указать, по  какому конкретному  полю  должна выполняться сортировка. Запись +m означает, что первые m полей должны быть проигнорированы при сравнении; +0 – это сравнение с начала строки. Например,

$ ls –l  | sort +3nr            Сортировка по размеру по убыванию

$ who | sort +4n                Сортировка по времени регистрации по убыванию

Среди других полезных параметров сортировки упомянем –o, который определяет выходной файл (это может быть один из входных файлов), и –u, позволяющий игнорировать строки, совпадающие по полю сорти ровки.

Можно задать несколько параметров сортировки, как в примере, взя том со страницы руководства sort(1):

$ sort +0f +0  –u имена5файлов

Здесь   +0f  сортирует строки без  учета  регистра,  однако идентичные строки не обязательно соседствуют. Следующий параметр +0 выполняет  сортировку совпадающих строк  в  обычном алфавитном порядке. Наконец, –u исключает дубликаты строк. Таким образом, получив набор слов, по одному  на  строке, команда выведет список неповторяю-

щихся слов. Предметный указатель оригинального издания этой книги был подготовлен аналогичной командой sort с использованием дополнительных возможностей, описанных в sort(1).

Команда uniq послужила прототипом флага –u  команды sort:  она  отбрасывает смежные  дублирующиеся строки,  оставляя  только одну. Наличие для этой  цели отдельной программы позволяет решать зада чи, не связанные с сортировкой. Например, uniq может удалить повто ряющиеся пустые строки, даже если входной файл не отсортирован.

Параметры позволяют выбрать способ обработки дублей: uniq  –d выве дет  только те  строки,  которые были  дублированы; uniq   –u выводит уникальные строки (т. е. не повторяющиеся); а uniq   –c подсчитывает количество вхождений каждой строки. Ниже будет приведен пример.

Команда comm применяется для  сравнения файлов. Получив два отсор5 тированных  входных файла, comm  выведет результат в три  столбца: строки, которые встречаются только в первом файле, строки, встречающиеся только  во втором и строки, встретившиеся в обоих  файлах. Вывод любого из столбцов можно отменить параметром:

$ comm  –12 f1  f2

выведет только строки, вошедшие в оба файла, а

$ comm  –23 f1  f2

выведет строки, присутствующие только в первом файле и отсутствующие  во  втором.  Это  можно использовать для  сравнения  каталогов или списка слов со словарем.

Команда tr выполняет замену символов во входном файле. Чаще всего она применяется для замены регистра:

$ tr a-z  A-Z           Заменить нижний регистр на верхний

$ tr A-Z a-z            Заменить верхний регистр на нижний

Команда dd заметно отличается от всех команд, рассмотренных до сих пор.  Она  предназначена  главным образом для обработки данных на магнитных лентах из  других систем – само имя напоминает о языке управления заданиями OS/360.1 Команда может выполнять замену регистра (с синтаксисом, существенно отличающимся от tr); преобразование кода ASCII в EBCDIC и обратно; чтение и запись данных блоками фиксированного размера с  заполнением отсутствующих полей пробелами, что используется в некоторых других операционных системах. На  практике команда  dd часто  применяется для  работы с «сырыми» неформатированными данными независимо от их происхождения, она также имеет возможность обработки двоичных данных.

1        Язык управления заданиями (Job Control Language, JCL) для IBM System/ 360 содержал подробную спецификацию определения наборов данных (Dataset Definition, DD) для устройств ввода-вывода. – Примеч. ред.

Чтобы продемонстрировать возможности  совместной работы фильтров, рассмотрим конвейер из команд, который выводит 10 слов, наибо лее часто встречающихся во входном файле:

cat  $* |

tr –sc  A–Za–z  ‘\012′ | Заменяет все небуквы на символы новой строки

sort | uniq  –c  | sort –n | tail  |

5

Команда cat занимается сбором файлов и передает их во входной поток tr. Команда tr взята из руководства: она заменяет все последовательности  символов, не являющихся буквами, символом новой строки, помещая, таким образом, каждое слово на отдельную строку. Затем список  сортируется, и  команда  uniq  –c  удаляет повторяющиеся слова, вставляя перед  оставшимися словами счетчик вхождений, по которому выполняется сортировка командой sort  –n. (Такое сочетание двух  команд sort, окружающих команду uniq, встречается настолько часто, что  может  считаться идиомой.) В  результате получен  список слов,  встречающихся в документе, отсортированный в порядке увеличения частоты использования.

Команда tail выводит 10 самых популярных слов,  а 5 располагает их в пяти столбцах.

Кстати, обратите внимание, что команда, заканчивающаяся символом |, может быть продолжена на следующей строке.

Упражнение 4.3.  Используйте команды этого раздела для программы проверки орфографии по словарю /usr/dict/words. В чем недостатки такого подхода и как их исправить? ~

Упражнение 4.4.  Напишите программу подсчета слов  на своем  люби мом  языке программирования и сравните ее размер, скорость выполнения и гибкость с конвейером команд. Сколько потребуется усилий для превращения ее в программу проверки орфографии? ~

Источник: Керниган Б., Пайк Р., UNIX. Программное окружение. – Пер. с англ. – СПб: Символ-Плюс, 2003. – 416 с., ил.

По теме:

  • Комментарии