Пригласительные на свадьбу в электронном виде шаблон wedding-post.ru.
Руководство пользователя для 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
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|