КОНВЕЙЕРНАЯ ОБРАБОТКА ТЕКСТОВЫХ ФАЙЛОВ




ПРОГРАММНЫЕ КАНАЛЫИ КОНВЕЙЕР КОМАНД

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

В командной строке программный канал обозначает символ вертикальной черты | между командами с пробелом слева и справа от него.

Если в командной строке программные каналы соединяют больше, чем две последовательные команды, то образуется конвейер команд. При этом все команды конвейера выполняются параллельно, а синхронизацию их работы обеспечивает командный процессор. Он приостанавливает выполнение команды, если из ее входного канала нечего читать или когда ее выходной канал временно переполнен. Все программные каналы конвейера по-прежнему обозначают операторы |, которые должны быть расположены между последовательными командами в нем.

Ниже приведен пример, который демонстрирует следующая командная строка, где конвейер команд cat, tr и grep позволяет определить как часто упоминается слово физика (physic) в текстовом файле study:

$ cat study | tr –cs A-Za-z ‘\012’ | grep –c physic

В этом конвейере команда cat обеспечивает стандартный вывод файла study, который через первый программный канал передается на стандартный ввод команды транслитерации tr. Опции cs заставляют ее сжимать все не буквы (символы вне литерного диапазона A-Z и a-z) первого аргумента в перевод строки, заданный его кодом ASCII во втором аргументе. В результате получится поток строк из одного слова, который через второй программный канал поступает на стандартный ввод команды grep. Она реализует поиск строк стандартного ввода по заданному образцу. В данном случае опция –с заставляет ее ограничиться подсчетом строк, содержащих сочетание physic, заданное ее аргументом. Результат этого подсчета отображается через поток стандартного вывода.

 

ПЕРЕНАПРАВЛЕНИЕ ВВОДА-ВЫВОДА

Многие команды OS UNIX используют стандартные информационные потоки для ввода данных, вывода результатов и протокола диагностики. Эти стандартные потоки обозначают дискрипторы 0, 1 и 2. По умолчанию они связаны с управляющим терминалом, откуда вызвана команда. Командный процессор позволяет перенаправить стандартные потоки команд в файлы и программные каналы. Для этого в командной строке предусмотрено использование следующей символики перенаправления стандартных потоков:

< file – переключение стандартного ввода на ввод из файла

> file – переключение стандартного вывода на вывод в файл

2> file – переключение протокола стандартной диагностики в файл

>> file – добавление стандартного вывода в конец файла

2>> file – добавление протокола стандартной диагностики в конец файла

<< word – ограничение стандартного ввода заданным словом

Перечисленные операторы переключения стандартных потоков допустимо применять как по отдельности, так и комбинировать их в командной строке.

 

Например:

$ cat > file.txt << end

Ø Aaa

Ø bbb

Ø end = завершение ввода (аналогично Ctrl+d)

Содержимое файла file.txt можно проверить командой

$ cat file.txt

Его содержимое будет следующим:

Aaa

bbb

Такой же результат даст команда

$ cat << end > file.txt

 

Следующая команда добавит в конец файла текущую дату:

$ date >> file.txt

file.txt:

Aaa

bbb

Fri Sep 25 12:00:00 GMT+3 2015

 

ВЫПОЛНЕНИЕ ЛАБОРАТОРНОЙ РАБОТЫ

Рассмотрим пример решения следующей задачи.

Разработать командную процедуру для поиска в любом текстовом файле заданного числа наиболее часто повторяющихся слов из латинских букв, которые начинаются с заглавной буквы. Имя файла и число слов должны передаваться ей через аргументы командной строки. Результат поиска должен отображать стандартный вывод списка слов, где они упорядочены по частоте повторений, а для каждого слова указано число его повторений. В командной процедуре должен быть реализован конвейер команд cat, tr, grep, sort, uniq и tail, который обеспечивает последовательную обработку текста и отображение требуемого результата. Разработка должна быть ориентирована на использование в OS UNIX и Linux.

 

Алгоритм выполнения задания:

1. Создать файл lab.bat и записать в него конвейер команд.

2. Создать файл test.ref и внести в него данные для обработки.

3. Отладить программу, содержащуюся в lab.bat, введя в командную строку терминала xterm.

$ chmod 755 lab.bat

4. Вызвать командную процедуру lab.bat для примера test.ref выполнив в окне эмулятора терминала xterm команду:

$./lab.bat test.ref 3

 

Командная процедура

В любом графическом окне текстового редактора xedit ввести следующий файл командной процедуры (можно без комментариев) и сохранить его под именем lab.bat:

#! /bin/bash

cat $1 | # Запись заданного файла в канал

tr -cs A-Za-z '\012' | # Сжатие не букв в перевод строки

grep '^[A−Z]' | # Поиск слов с заглавной первой буквой

sort | # Сортировка в алфавитном порядке

uniq -c | # Подсчет и исключение повторов слов

sort -n | # Сортировка по числу повторов слов

tail -l $2 # Вывод заданного числа слов

 

Контрольный пример

В свободном графическом окне текстового редактора xedit нужно ввести следующий текст для отладки командной процедуры lab.bat и сохранить его в файле под именем test.ref:

abc Abc

Abc de88de de de

Fgk,Fgk Abc abc

Lm Fgk Nop

 

Отладка

Задать права доступа по выполнению для командного файла lab.bat., введя следующую командную строку в окне эмулятора терминала xterm:

$ chmod 755 lab.bat

Вызвать командную процедуру repeat.bat для файла контрольного примера test.ref, введя следующую командную строку в окне эмулятора терминала xterm:

$./lab.bat test.ref 3

Результатом ее выполнения должен быть стандартный вывод следующих трех строк в окне эмулятора терминала xterm:

1 Nop

3 Abc

3 Fgk

Интерпретация

Командная процедура lab.bat состоит из семи командных строк, которые соединяют 6 программных каналов |, образуя конвейер команд. При вызове, ее командные строки будет интерпретировать командный процессор bash. При этом он порождает, соответственно, 7 программных процессов выполнения команд cat, tr, grep, sort, uniq, sort и tail. Каждая из них является фильтром, а ее стандартный ввод-вывод переадресован в программные каналы.

1. Начальная команда cat реализует стандартный вывод файла, заданного первым параметром командной процедуры, который доступен через позиционную переменную $1.

2. Через первый программный канал текст файла передается на стандартный ввод команды транслитерации tr.

Ключ –с заставляет команду работать со всеми символами, кроме указанных в наборе 1 (то есть не с буквами). Опция –s позволяет заменить повторяющиеся подряд символы из набора 1 на единственный символ из набора 2; если список 2 отсутствует, то заменяет множественные символы одиночными. Таким образом, опции −cs заставляют ее сжимать все стоящие подряд не буквы (символы вне литерного диапазона первого параметра) в один символ перевода строки (\n), который задан своим кодом ASCII во втором параметре (можно писать ‘\n’). В результате, стандартный вывод этой команды образует последовательность слов (по одному в каждой строке), которая через второй программный канал поступает на стандартный ввод команды grep.

Результатом выполнения команды для расматриваемого примера будет

abc

Abc

Abc

de

de

de

de

Fgk

Fgk

Abc

abc

Lm

Fgk

Nop

 

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

Результатом выполнения команды будет

Abc

Abc

Fgk

Fgk

Abc

Lm

Fgk

Nop

Эти слова через третий программный канал передаются команде sort.

 

4. Команда sort сортирует список в алфавитном порядке.

В результате выполнения команды будет получен соелующий поток данных:

Abc

Abc

Abc

Fgk

Fgk

Fgk

Lm

Nop

Отсортированный список слов, где все одинаковые слова оказались рядом, через четвертый программный канал передается на стандартный ввод команды унификации uniq.

 

5. Команда unic удаляет дубликаты всех слов. Опция −c означает, что перед каждым словом стандартного вывода команды uniq будет записано число повторений.

Результатом выполнения команды будет

3 Abc

3 Fgk

1 Lm

1 Nop

Следует отметить, что если список не отсортировать, то команда uniq не найдет повторений и результат будет следующим

2 Abc

2 Fgk

1 Abc

1 Lm

1 Fgk

1 Nop

Список слов, полученный после выполнения команды, через пятый программный канал поступает на стандартный ввод второй команды sort.

 

6. Опция −n команды sort обеспечивает его сортировку по числовым полям в порядке возрастания. После такой сортировки все слова исходного текста будут упорядочены по числу повторов, которое записано в строке каждого слова их списка.

Результат выполнения команды приведен ниже:

1 Lm

1 Nop

3 Abc

3 Fgk

 

7. Через последний программный канал этот список слов поступает на стандартный ввод команды tail, которая оставляет в нем для своего стандартного вывода число последних строк, заданное параметром после опции – l (здесь l означает line, т.е. строки. Также допустимо использование –с – символов, –b – блоков). Это значение передается командной процедуре через позиционную переменную $2 вторым аргументом командной строки ее вызова.

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

Итог работы всей программы:

1 Nop

3 Abc

3 Fgk

 

ЛИТЕРАТУРА

Д. Тейнсли

Linux и UNIX: программирование в shell. Руководство разработчика − К.: BHV, 2001.

Б.В. Керниган, Р. Пайк

UNIX − универсальная среда программирования − М.: Финансы и статистика, 1992.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2020-11-18 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: