Я создаю набор сопоставлений, которые можно проиндексировать, используя 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 упрощает это, как первоначально требовалось, но интересуется,это более простой подход.