Встроенные переменные: настройка процесса обработки данных
Утилита awk использует встроенные переменные, которые позволяют настраивать процесс обработки данных и дают доступ, как к обрабатываемым данным, так и к некоторым сведениям о них. Мы уже рассматривали позиционные переменные — $1, $2, $3, которые позволяют извлекать значения полей, работали мы и с некоторыми другими переменными. На самом деле, их довольно много. Вот некоторые из наиболее часто используемых: · FIELDWIDTHS — разделённый пробелами список чисел, определяющий точную ширину каждого поля данных с учётом разделителей полей; · FS — уже знакомая вам переменная, позволяющая задавать символ-разделитель полей; · RS — переменная, которая позволяет задавать символ-разделитель записей; · OFS — разделитель полей на выводе awk-скрипта; · ORS — разделитель записей на выводе awk-скрипта. По умолчанию переменная OFS настроена на использование пробела. Её можно установить так, как нужно для целей вывода данных: awk 'BEGIN{FS=":"; OFS="-"} {print $1,$6,$7}' /etc/passwd Установка разделителя полей выходного потока Переменная FIELDWIDTHS позволяет читать записи без использования символа-разделителя полей. В некоторых случаях, вместо использования разделителя полей, данные в пределах записей расположены в колонках постоянной ширины. В подобных случаях необходимо задать переменную FIELDWIDTHS таким образом, чтобы её содержимое соответствовало особенностям представления данных. При установленной переменной FIELDWIDTHS awk будет игнорировать переменную FS и находить поля данных в соответствии со сведениями об их ширине, заданными в FIELDWIDTHS. Предположим, имеется файл testfile, содержащий такие данные: 1235.9652147.91 927-8.365217.27 36257.8157492.5 Известно, что внутренняя организация этих данных соответствует шаблону 3-5-2-5, то есть, первое поле имеет ширину 3 символа, второе — 5, и так далее. Вот скрипт, который позволит разобрать такие записи:
awk 'BEGIN{FIELDWIDTHS="3 5 2 5"}{print $1,$2,$3,$4}' testfile Использование переменной FIELDWIDTHS Посмотрим на то, что выведет скрипт. Данные разобраны с учётом значения переменной FIELDWIDTHS, в результате числа и другие символы в строках разбиты в соответствии с заданной шириной полей. Переменные RS и ORS задают порядок обработки записей. По умолчанию RS и ORS установлены на символ перевода строки. Это означает, что awk воспринимает каждую новую строку текста как новую запись и выводит каждую запись с новой строки. Иногда случается так, что поля в потоке данных распределены по нескольким строкам. Например, пустьимеетсятакойфайлсименем addresses: Person Name 123 High Street (222) 466-1234
Another person 487 HighStreet (523) 643-8754 Если попытаться прочесть эти данные при условии, что FS и RS установлены в значения по умолчанию, awk сочтёт каждую новую строку отдельной записью и выделит поля, опираясь на пробелы. Это не то, что нам в данном случае нужно. Для того, чтобы решить эту проблему, в FS надо записать символ перевода строки. Это укажет awk на то, что каждая строка в потоке данных является отдельным полем. Кроме того, в данном примере понадобится записать в переменную RS пустую строку. Обратите внимание на то, что в файле блоки данных о разных людях разделены пустой строкой. В результате awk будет считать пустые строки разделителями записей. Вот как всё это сделать: awk 'BEGIN{FS="\n"; RS=""} {print $1,$3}' addresses Результаты настройки переменных RS и FS Как видите, awk, благодаря таким настройкам переменных, воспринимает строки из файла как поля, а разделителями записей становятся пустые строки.
Воспользуйтесь поиском по сайту: ©2015 - 2025 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|