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

О проекте

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

MySQL

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

Хостинг

Другое








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

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

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

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

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

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

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

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

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

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

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

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



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




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

11. Массивы в awk

11.9 Многомерные массивы

Многомерный массив --- такой массив, в котором элемент указывается последовательностью индексов, а не одним индексом. Например, двумерный массив требует два индекса. Обычный способ (в большинстве языков, включая awk) ссылаться на элемент двумерного массива с именем grid есть grid[x,y].

Многомерные массивы в awk поддерживаются конкатенацией индексов в одну цепочку. Точнее, awk конвертирует индексы в цепочки (см. раздел 7.4 [Конверсия цепочек и чисел], стр. 81) и сцепляет их вместе с разделителями между ними. Это создает одну цепочку, которая описывает значения всех индексов. Комбинированная цепочка используется как один индекс в обычном одномерном массиве. В качестве сепаратора используется значение переменной SUBSEP.

Например, предположим, что вычисляем выражение `foo[5,12] = "value"' при значении SUBSEP равном "@". Номера пять и 12 конвертируются в строки и соединяются с `@' между ними, что приводит к "5@12"; таким образом, элементу foo["5@12"] присваивается в качестве значения "value".

Когда запоминается элемент массива, для awk безразлично, был ли он с одним индексом или с последовательностью индексов. Два выражения `foo[5,12]' и `foo[5 SUBSEP 12]' всегда эквивалентны.

По умолчанию значением SUBSEP служит цепочка ""034", которая содержит непечатный символ, появление которого маловероятно в awk-программе или во входных данных. Польза выбора маловероятных символов проистекает из факта, что значения индекса, содержащего цепочку, соответствующую SUBSEP, иногда приводят к комбинированным цепочкам не взаимно однозначно. Предположим, что SUBSEP была бы "@"; тогда `foo["a@b", "c"]' и `foo["a", "b@c"]' были бы неразличимыми, так как оба запомнятся как `foo["a@b@c"]'.

Можно проверить, имеется ли определенная индексная последовательность в "многомерном" массиве с помощью того же самого оператора `in', используемого для одномерных массивов. Вместо единственного индекса в позиции левого операнда нужно писать всю последовательность индексов, разделенных запятыми и заключенную в скобки: (subscript1, subscript2, ...) in array.

Следующий пример трактует свой ввод как двумерный массив полей; оп поворачивает этот массив на 90 градусов по часовой стрелке и печатает результат. Предполагается, что все строки имеют одинаковое количество элементов.

awk '-
if (max.nf ! NF)
max.nf = NF max.nr = NR for (x = 1; x != NF; x++)
vector[x, NR] = $x ""

END -
for (x = 1; x != max.nf; x++) -
for (y = max.nr; y ?= 1; --y)
printf("%s ", vector[x, y]) printf(""n") "" ""'

Если задан ввод:

1 2 3 4 5 6 2 3 4 5 6 1 3 4 5 6 1 2 4 5 6 1 2 3

то программа выдаст:

4 3 2 1 5 4 3 2 6 5 4 3 1 6 5 4 2 1 6 5 3 2 1 6

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



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





Copyright © 2005-2016 Project.Net.Ru