Брайан Керниган - UNIX — универсальная среда программирования

Тут можно читать онлайн Брайан Керниган - UNIX — универсальная среда программирования - бесплатно ознакомительный отрывок. Жанр: comp-osnet, издательство Финансы и статистика, год 1992. Здесь Вы можете читать ознакомительный отрывок из книги онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    UNIX — универсальная среда программирования
  • Автор:
  • Жанр:
  • Издательство:
    Финансы и статистика
  • Год:
    1992
  • Город:
    Москва
  • ISBN:
    5-289-00253-4
  • Рейтинг:
    5/5. Голосов: 81
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 100
    • 1
    • 2
    • 3
    • 4
    • 5

Брайан Керниган - UNIX — универсальная среда программирования краткое содержание

UNIX — универсальная среда программирования - описание и краткое содержание, автор Брайан Керниган, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

В книге американских авторов — разработчиков операционной системы UNIX — блестяще решена проблема автоматизации деятельности программиста, системной поддержки его творчества, выходящей за рамки языков программирования. Профессионалам открыт богатый "встроенный" арсенал системы UNIX. Многочисленными примерами иллюстрировано использование языка управления заданиями shell.

Для программистов-пользователей операционной системы UNIX.

UNIX — универсальная среда программирования - читать онлайн бесплатно ознакомительный отрывок

UNIX — универсальная среда программирования - читать книгу онлайн бесплатно (ознакомительный отрывок), автор Брайан Керниган
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Использование ассоциативных массивов эффективно для вычислительных задач, таких, как подсчет частоты появления слов во входном потоке:

$ cat wordfreq

awk ' { for (i = 1; i <= NF; i++) num[$i]++ }

END {for (word in num) print word, num[word] }

' $*

$ wordfreq ch4.* | sort +1 -nr | sed 20q | 4

the 372 .CW 345 of 220 is 185

to 175 a 167 in 109 and 100

.PI 94 .P2 94 .PP 90 $ 87

awk 87 sed 83 that 76 for 75

The 63 are 61 line 55 print 52

$

В первом цикле forвыбирается каждое слово из входной строки и заполняется массив num, индексируемый словами. (Не путайте $i, обозначающее в awki-е поле входной строки, с переменными языка shell.) После того как файл будет прочитан, во втором цикле forпечатаются в произвольном порядке слова и частота их появления.

Упражнение 4.9

В результат действия команды wordfreqпопали команды форматирования типа .CW, которые применяются для печати слов определенным шрифтом. Как избавиться от таких ненастоящих слов? Как бы вы использовали команду tr, чтобы программа wordfreqработала правильно, независимо от того, прописные или строчные буквы задействованы во входном потоке? Сравните реализацию и скорость выполнения программы wordfreq, конвейера из разд. 4.2 и предлагаемого ниже решения.

sed 's/[→][→]*/\

/q' $* | sort | uniq -c | sort -nr

Строки

Хотя обе команды, и sedи awk, предназначены для решения небольших задач типа выбора определенного поля, только awkиспользуется в той степени, в какой предполагает настоящее программирование. Примером может служить программа, которая разбивает длинные строки, чтобы они занимали не более 80 позиций. Каждая строка, превышающая 80 символов, завершается после 80-го символа; в качестве предупреждения добавляется \и обрабатывается остаток строки. Хвост разбиваемой строки сдвигается к ее правому концу, а не к левому, что более удобно для программ печати, и именно поэтому мы обратимся к программе fold. Рассмотрим, в частности, строки из 20, а не из 80 позиций:

$ cat тест

Короткая строка

Строка немного длиннее

Эта строка еще длиннее, чем предыдущая строка

$ fold тест

Короткая строка

Строка немного длиннее

Эта строка еще длиннее,

чем предыдущая строка

$

Вам может показаться странным, что в седьмой версии системы нет программы для добавления или удаления символов табуляции, хотя команда prв System V выполняет и то и другое. Наша реализация программы foldиспользует редактор sed, чтобы перевести символы табуляции в пробелы и чтобы счетчик числа символов в awkпринял правильное значение. Это хороший способ при табуляции в начале строки (что типично для языковых программ), но номер позиции сбивается, если символ табуляции оказывается в середине строки:

# fold: fold long lines

sed 's/\(->/ /g' $* | # convert tabs to spaces

awk '

BEGIN {

N = 80 # folds at column 80

for (i = 1; i <= N; i++) # make a string of blanks

blanks = blanks " "

}

{

if ((n = length($0)) <= N)

print

else {

for (i = 1; n > N; n -= N) {

printf "%s\\\n", substr($0,i,N)

i += N;

}

printf "%s%s\n" , substr(blanks, 1, N-n), substr($0, I)

}

} '

На языке awkнет явной операции конкатенации строк; строки соединяются, если они следуют подряд. Вначале blanksявляется пустой строкой. Цикл в части BEGINсоздает длинную строку пробелов конкатенацией: каждый шаг цикла прибавляет еще один пробел к концу строки blanks. Во втором цикле входная строка разбивается на части, пока оставшаяся часть не станет достаточно короткой. Как и в языке Си, операцию присваивания можно использовать в качестве выражения, поэтому в конструкции

if ((n=length($0)) <= N)...

длина входной строки присваивается nдо проверки значения. Обратите внимание на скобки.

Упражнение 4.10

Измените программу foldтак, чтобы разрыв строки происходил на пробеле или символе табуляции, а не посреди слова. Сделайте эту программу пригодной и для длинных слов.

Взаимодействие с интерпретатором

Допустим, что вы намереваетесь написать программу field n. Эта программа будет печатать n-е поле каждой входной строки так, чтобы можно было, например, задать:

$ who | field 1

для печати только имен, под которыми пользователи входят в систему. Язык awkявно предоставляет возможность выбора полей. Наша основная задача — передать номер n программе awk. Ниже приведено одно из возможных решений:

$ awk '{print $'$1'}'

Здесь $1открыто (не внутри каких либо кавычек), и поэтому становится номером поля, доступным в программе awk. При ином решении используются кавычки:

awk "{print \$$1}"

Аргумент обрабатывается интерпретатором, поэтому \$становится $, а $1заменяется на значение n. Мы предпочитаем решение с апострофами (одиночными кавычками), поскольку при использовании кавычек в типичной программе awkпоявится слишком много символов \.

Другим примером может служить программа addup n, суммирующая значения n-го поля:

awk '{s += $'$1'}

END {print s}'

В третьем примере вычисляются отдельные суммы значений каждого n-го поля и полная сумма:

awk '

BEGIN { n = '$1' }

{ for (i=1; i <= n; i++)

sum[i] += $1

}

END { for(i = 1; i <= n; i++)

{

printf "%6g ", sum[i]

total += sum[i]

}

printf "; total = %6g ", total

}'

Нам удобнее было использовать часть BEGINдля засылки значения в переменную n, чем засорять конец программы кавычками.

Основная трудность во всех приведенных выше примерах состоит не в том, чтобы следить за кавычками (хотя и это хлопотно), а в том, что программы, составленные показанным способом, могут читать только свой стандартный входной поток. Нет никакой возможности передать им сразу и параметр n, и произвольно длинный список имен файлов. Для этого требуется определенная техника программирования на языке shell; которую мы рассмотрим в следующей главе.

Служебная программа-календарь на языке awk

В нашем последнем примере демонстрируются ассоциативные массивы, а также иллюстрируется взаимодействие с интерпретатором и частично показывается процесс разработки программы.

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

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Брайан Керниган читать все книги автора по порядку

Брайан Керниган - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




UNIX — универсальная среда программирования отзывы


Отзывы читателей о книге UNIX — универсальная среда программирования, автор: Брайан Керниган. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x