Ссылка на вложенные массивы в awk - PullRequest
0 голосов
/ 05 декабря 2018

Я создаю набор сопоставлений, которые можно проиндексировать, используя 3 ключа, например ниже:

mappings["foo"]["bar"]["blah"][1]=0
split( "10,13,19,49", mappings["foo"]["bar"]["blah"] )

Затем я могу индексировать во вложенный массив, используя, например,

mappings[product][format][version][i] 

Но это немного запутанно, когда мне нужно несколько раз обратиться к одному и тому же вложенному массиву, поэтому на других языках я бы создал ссылку на внутренний массив:

map=mappings[product][format][version]
map[i]

Однако яне могу заставить это работать в awk (gawk 4.1.3).

Я могу найти только одну ссылку через google, которая предполагает, что это невозможно в предыдущих версиях awk, и цикл, устанавливающий ключии значения по одному - единственное решение.Это все еще так или у кого-то есть предложения по лучшему решению?

https://developer.apple.com/library/archive/documentation/OpenSource/Conceptual/ShellScripting/Howawk-ward/Howawk-ward.html

РЕДАКТИРОВАТЬ

В ответ на комментарии немногобольше информации о том, что я пытаюсь сделать.Если есть лучший подход, я полностью его использую!

У меня есть набор файлов CSV, которые я загружаю в AWK.Идея состоит в том, чтобы вычислить контрольную сумму на основе определенных столбцов после применения фильтрации к строкам.

Столбцы для контрольной суммы и применяемая фильтрация получены из параметров времени выполнения, отправленных в сценарий.

Параметры времени выполнения - это тройка из (product, format, version), поэтому я использую 3-вложенный ассоциативный массив.

Другой подход заключается в использовании тройного в качестве одного ключа, а не вложения,но gawk, по-видимому, изначально не поддерживает это, так что в итоге я бы конкатенировал значения в виде строки.Мне это показалось немного менее структурированным, но если я ошибаюсь, рад изменить свое мнение об этом приборе.

В любом случае, именно эти параметры используются для индексации массива и его структуры для извлеченияномера столбцов и т. д.

Затем можно создать древовидную структуру, например, ниже показаны 2 формата для продукта foo на версии blah и т. д.:

mappings["product-foo"]["format-bar"]["version-blah"][1]=0
split( "10,13,19,49", mappings["product-foo"]["format-bar"]["version-blah"] )
mappings["product-foo"]["format-moo"]["version-blah"][1]=0
split( "55,23,14,6", mappings["product-foo"]["format-moo"]["version-blah"] )

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

    (FNR>1 && (format!="some-format" ||
              (version=="some-version" && $1=="some-filter")  ||
              (version=="some-other-version" && $8=="some-other-filter"))) {
           # Loop over each supplied field summing an absolute tally for each
           for (i=1; i <= length(mappings[product][format][version]); i++) {
               sumarr[i] += ( $mappings[product][format][version][i] < 0 ? -$mappings[product][format][version][i]:$mappings[product][format][version][i] )
           }
    }

Комментарий от @ ed-morton упрощает это, как первоначально требовалось, но интересуется,это более простой подход.

1 Ответ

0 голосов
/ 07 декабря 2018

Правильный ответ от @ ed-morton выше (спасибо!).

Ed - если вы напишите это как ответ, я приму его, в противном случае я приму эту цитату в несколькихдней для хорошего ведения хозяйства.

Правильно, в awk нет функции копирования массива, нет указателей / ссылок, поэтому вы не можете создать указатель на массив.Конечно, вы можете создать карту функций (i) {вернуть отображения [product] [format] [version] [i]}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...