как создать вложенный массив jq без ключа (только значение )и преобразовать в csv

Вы можете спутать с zsh. tcshне имеет опции extended_glob. У него есть опция globstarдля добавления рекурсивных операторов glob **/и ***/для zsh(globstar, названных в честь той же опции в ksh93, хотя ksh93добавил только вариант **/noglobиnonomatch(эти два скопированы zsh, хотя noglobизначально было от ksh, я полагаю, ).

Параметры — это просто специальные переменные вtcsh(обратите внимание, что это также имело место вbash(другой оболочке с наследием tcsh )изначально, пока она не изменилась на использование новой shoptвстроенной ), поэтому включите опцию, вы просто устанавливаете переменную:

set globstar

Подробнее см. man tcsh.

8
20.08.2021, 07:41
1 ответ

.[].results[]— набор массивов. В каждом массиве первый элемент — это то, что вы хотите иметь в первом столбце, а второй элемент — это другой массив, который мы хотим перебрать.

Итак, давайте отследим первый элемент в $name(, предполагая, что это какое-то имя кластера ), а затем выведем его вместе с каждым элементом подмассива -:

.[].results[] |.[0] as $name |.[1][]? //.[1] | [ $name,. ] | @csv

Бит, который говорит .[1][]? //.[1], выбирает элементы подмассива -, если он существует, в противном случае он выбирает второй элемент массива (и вместо этого предполагает, что это скаляр ).

В командной строке:

jq -r '.[].results[] |.[0] as $name |.[1][]? //.[1] | [ $name,. ] | @csv' file

Результат для вашего примера документа:

"sm-clust001","163slesm02"
"sm-clust001","163slesm01"
"sm-cssl112","ucsbnchac240"
"sm-cssl112","ucsbnchac209"
"sm-cssl112","ucsbnchac241"
"sm-cssl112","ucsbnchac242"
"ASite","unixhost1123"

Это решение обобщается для любого количества столбцов в моем ответе на дополнительный вопрос пользователя .

4
20.08.2021, 09:05

Теги

Похожие вопросы