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

О проекте

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

MySQL

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

Хостинг

Другое








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

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

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

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

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

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

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

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

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

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

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

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



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





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

5. Чтение входных файлов

5.1 Как вход делится на записи

Интерпретатор awk разделяет ввод для вашей программы на записи и поля. Записи разделяются знаками, называемыми разделителями записей. По умолчанию, это знаки newline. Поэтому по умолчанию записи совпадают со строками. Вы можете использовать другие символы как разделители записей, присваивая их встроенной переменной RS.

Значение RS можно менять в awk-программе, подобно другим переменным, оператором присваивания `=' (см. раздел 7.7 [Присваивающие выражения], стр. 84). Новый разделитель записей нужно заключать в кавычки для строковой константы. Обычно это делается в начале исполнения, до обращения к вводу, так что самая первая запись будет читаться с нужным разделителем. Чтобы сделать это, используйте специальный образец в BEGIN (см. раздел 8.1.5 [Специальные образцы BEGIN и END], стр. 100).

 Например:

awk 'BEGIN - RS = "/" "" ; - print $0 ""' BBS-list

изменяет значение RS на "/" до чтения ввода. Это цепочка, первый символ в которой есть слеш; в результате записи разделяются слешами. Затем читается входной файл и второе правило в awk-программе (действие без образца) печатает каждую запись. Поскольку каждый оператор печати добавляет newline в конец вывода, в результате выполнения этой awk-программы будет получена копия ввода, где каждый слеш заменен на newline.

Вот результат исполнения программы на  `BBS-list':

$ awk 'BEGIN - RS = "/" "" ; - print $0 ""' BBS-list
a aardvark 555-5553 1200 
a 300 B 
a alpo-net 555-3412 2400 
a 1200 
a 300 A
a barfly 555-7685 1200 
a 300 A 
a bites 555-1675 2400 
a 1200 
a 300 A
a camelot 555-0542 300 C 
a core 555-2912 1200 
a 300 C 
a fooey 555-1234 2400
a 1200 
a 300 B 
a foot 555-6699 1200 
a 300 B 
a macfoo 555-6480 1200 
a 300 A
a sdace 555-3430 2400 
a 1200 
a 300 A 
a sabafoo 555-2127 1200 
a 300 C
a

Заметим, что запись с `camelot' BBS не разделена. В оригинальном файле данных (см. раздел 1.3 [Файлы с данными для примеров], стр. 7), эта строка выглядит так:

camelot 555-0542 300 C

Она содержит только одну baud rate; поэтому в записи нет слешей. Другой способ изменить разделитель записей есть командная строка, использующая свойство присваивания переменной (см. раздел 14.2 [Другие аргументы командной строки], стр. 165).

awk '- print $0 ""' RS="/" BBS-list

Это присваивает RS значение `/' перед обработкой `BBS-list'. Употребление необычного символа, такого как `/', для разделения записей приводит к правильному поведению в подавляющем большинстве случаев. Однако, следующий (экстремальный) конвейер печатает неожиданную `1'. Имеется одно поле, состоящее из newline. Значение встроенной переменной NF есть количество полей в текущей записи.


$ echo -- awk 'BEGIN - RS = "a" "" ; - print NF ""'

a 1

Достижение конца ввода заканчивает текущую входную запись, даже если последний символ в файле не есть символ из RS (d.c.).

Пустая цепочка "" (цепочка без символов) имеет специальный смысл в качестве значения RS: она означает, что записи разделяются одним или больше пробелами, и ничем другим. См. раздел 5.7 [Многострочные записи], стр. 51, для деталей.

Если изменить значение RS в процессе исполнения awk, новое значение будет использоваться для разделения следующих записей после окончания обработки текущей записи с прежним разделителем. По достижении конца этой записи gawk устанавливает переменную RT по тексту во вводе, предназначенному для RS. Значения RS не ограничиваются одно-символьными цепочками. Это может быть любое регулярное выражение (см. Главу 4 [Регулярные выражения], стр. 23). В общем случае, запись оканчивается на первой цепочке, соответствующей этому регулярному выражению; следующая запись начинается после конца этой цепочки. Это общее правило работает и в обычном случае, когда RS имеет значение newline: запись кончается по началу следующей обнаруженной строки (следующее newline в вводе) и следующая запись начинается сразу после конца этой строки (с первого символа следующей). Символ newline, поскольку он соответствует RS, не является частью записи.

Когда RS есть простой символ, RT будет содержать то же значение. Однако, если RS есть регулярное выражение, RT становится более полезной; она содержит фактически входной текст, который соответствует этому регулярному выражению. Следующий пример иллюстрирует обе эти особенности. Он устанавливает RS равной регулярному выражению, которое соответствует или newline, или ряду из одной или более букв верхнего регистра, выборочно начинающейся и/или кончающейся белым пробелом (см. Главу 4 [Регулярные выражения], стр. 23).


$ echo record 1 AAAA 
record 2 BBBB 
record 3 -- ? 
gawk 'BEGIN - RS =
""n--( *[[:upper:]]+ *)" 
"" ? - print "Record =", $0, "and RT =", RT ""'

a Record = record 1 and RT = AAAA 
a Record = record 2 and RT = BBBB
a Record = record 3 and RT = 
a

Конечная строка выхода имеет дополнительную строку пробелов. Это происходит потому, что значение RT есть newline, и тогда оператор print выдает свою собственную заключительную newline. См. раздел 16.2.8 [Простой поточный редактор], стр. 242, о более интересном примере с RS как regexp и с RT.

Использование RS в качестве регулярного выражения и переменной RT есть расширения gawk; они отсутствуют в режиме эмуляции (см. раздел 14.1 [параметры командной строки], стр. 161). В режиме эмуляции только первый символ в значении RS используется для определения конца записи. Интерпретатор awk запоминает количество записей, прочитанных им из текущего входного файла. Это число хранится в переменной FNR. Она сбрасывается на 0 в начале чтения каждого файла. Другая встроенная переменная, NR, содержит полное количество записей, прочтенных из входных файлов с данными. Она начинает с 0 и никогда не сбрасывается автоматически на 0.

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



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





Copyright © 2005-2016 Project.Net.Ru