П О Р Т А Л                            
С Е Т Е В Ы Х                          
П Р О Е К Т О В                        
  
Поиск по сайту:
                                                 
Главная

О проекте

Web-мастеру
     HTML & JavaScript
     SSI
     Perl
     PHP
     XML & XSLT
     Unix Shell

MySQL

Безопасность

Хостинг

Другое








Самое читаемое:

Учебник PHP - "Для Чайника".
Просмотров 3408 раз(а).

Иллюстрированный самоучитель по созданию сайтов.
Просмотров 5957 раз(а).

Учебник HTML.
Просмотров 3201 раз(а).

Руководство по PHP5.
Просмотров 5418 раз(а).

Хостинг через призму DNS.
Просмотров 4017 раз(а).

Подборка текстов стандартных документов.
Просмотров 55707 раз(а).

Учебник PHP - Самоучитель
Просмотров 2994 раз(а).

Документация на MySQL (учебник & справочное руководство)
Просмотров 4567 раз(а).

Внешние атаки...
Просмотров 3731 раз(а).

Учебник PHP.
Просмотров 2766 раз(а).

SSI в примерах.
Просмотров 37384 раз(а).



 
 
| Добавить в избранное | Сделать стартовой | Помощь





Руководство пользователя для GNU Awk

16. Практические awk-программы

16.2 Разные awk-программы

16.2.5 Генерирование счетчиков употребления слов

Следующая ниже awk-программа печатает количество вхождений каждого слова в вводе. Она иллюстрирует ассоциативную природу массивов в awk посредством употребления цепочек в качестве индексов. Она также демонстрирует конструкцию `for x in array'.

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

awk ' # Напечатать список частоты употребления слов -
for (i = 1; i != NF; i++)
freq[$i]++ ""
END -
for (word in freq)
printf "%s"t%d"n", word, freq[word] ""'

Первое, что нужно заметить об этой программе, это то, что она имеет два правила. Первое правило, имеющее пустой образец, выполняется для каждой записи во вводе. Оно использует механизм awk для доступа к полям (см. раздел 5.2 [Исследование полей], стр. 40) для выборки отдельных слов из записи и встроенную переменную NF (см. Главу 10 [Встроенные переменные], стр. 115) для определения числа полей.

Для каждого входного слова один из элементов массива freq увеличивается на 1 в знак того, что слово появилось еще раз.

Второе правило, так как оно имеет образец END, не выполняется пока не окончится ввод. Оно печатает содержание таблицы freq, которая была построена по первому правилу.

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

Слова определяются с использованием соглашения awk, что поля отделяются посредством whitespace и что другие символы в вводе (кроме newline) не имеют специального смысла Это значит, что пунктуация считается частью слов.

Язык awk рассматривает символы верхнего и нижнего регистров как различные. Следовательно, `bartender' и `Bartender' не рассматриваются как одно и то же слово. Это нежелательно, поскольку в нормальном тексте слова начинаются с большой буквы, если стоят в начале предложения, и анализатор частоты не должен различать их.

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

Путь для решения этих проблем состоит в использовании более совершенных средств языка awk. Прежде всего, нужно использовать tolower для устранения различий в регистрах. Затем, использовать gsub для удаления знаков пунктуации. Наконец, нужно использовать системную утилиту sort для обработки выхода по сценарию awk. Вот новая версия этой программы:

# Печатать список частот слов -

$0 = tolower($0) # устраняет различие в регистрах
gsub(/[^a-z0-9. "t]/, "", $0) # устраняет пунктуацию
for (i = 1; i != NF; i++)
freq[$i]++ ""
END -
for (word in freq)
printf "%s"t%d"n", word, freq[word] ""

Предположим, что эта программа лежит в файле с именем `wordfreq.awk' и что данные лежат в файле `file1'. Тогда следующий конвейер

awk -f wordfreq.awk file1 -- sort +1 -nr

выдаст таблицу слов, обнаруженных в файле `file1' в порядке убывания частоты.

Программа awk просматривает данные и выдает неупорядоченную таблицу слов. Затем результат awk сортируется утилитой sort и печатается на терминале. Параметр, указанный для sort в нашем случае, предписывает сортировку по второму полю входных строк (пропуская одно поле), так что ключи сортировки должны рассматриваться как числа (иначе `15' будет идти до `5'), и что сортировка должна идти в нисходящем (обратном) порядке. Мы могли бы даже сделать сортировку внутри программы, изменив действия END так:

END -
sort = "sort +1 -nr" for (word in freq)
printf "%s"t%d"n", word, freq[word] -- sort close(sort) ""

Нужно применять этот способ сортировки на системах, которые не имеют настоящих конвейеров.

См. общую документацию по операционной системе о деталях использования программы sort.

Назад | Вперед
Содержание (общее) | Содержание раздела | Содержание подраздела



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





Copyright © 2005-2016 Project.Net.Ru