Руководство пользователя для GNU Awk
5. Чтение входных файлов
5.3 Непостоянные номера полей
Номер поля не обязан быть константой. Любое выражение языка awk может быть использовано после `$' для ссылки на поле. Значение выражения указывает номер поля. Если значение есть не число, а цепочка, она конвертируется в номер.
Рассмотрим такой пример:
awk '- print $NR ""'
Напомним, что NR есть количество прочитанных до настоящего момента записей: один для первой записи, два во второй, и т.д. Так что этот пример печатает первое поле первой записи, второе поле второй записи, и т.д. Для двадцатой записи печатается поле номер 20; обычно запись имеет меньше 20 полей, так что это будет пустая строка.
Вот другой пример использования выражения
в качестве номера поля:
awk '- print $(2*2) ""' BBS-list
awk должен вычислить выражение `(2*2)' и использовать его значение как номер поля для печати. Знак `*' означает умножение, так что выражение `2*2' вычисляется как четыре. Скобки употреблены для того, чтобы умножение было произведено до операции `$'; они необходимы всегда, когда в выражении для номера поля встречается бинарная операция. Наш пример поэтому печатает операционные часы (четвертое поле) каждой строки файла `BBS-list'.
(Все операторы awk перечислены в порядке убывания приоритета в разделе 7.14 [Приоритет операторов (Как операторы гнездятся)], стр. 94.) Если вычисленный номер поля есть 0, вы получаете всю запись. Так, $(2-2) имеет тот же смысл, что и $0. Отрицательные номера полей недопустимы; такая ссылка обычно приводит к прекращению исполнения программы. (Стандарт POSIX не предусматривает отрицательной ссылки на номер записи. gawk замечает это и прекращает выполнение программы. Другие реализации awk могут вести себя по-другому.)
Как упоминалось в разделе 5.2 [Обследование полей], стр. 40, количество полей текущей записи содержится в встроенной переменной NF (см. также Гл. 10 [Встроенные переменны, стр. 115). Выражение $NF не имеет специального смысла и использует значение NF как номер поля.
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|