Вы можете спутать с zsh
. tcsh
не имеет опции extended_glob
. У него есть опция globstar
для добавления рекурсивных операторов glob **/
и ***/
для zsh
(globstar
, названных в честь той же опции в ksh93, хотя ksh93
добавил только вариант **/
)и noglob
иnonomatch
(эти два скопированы zsh
, хотя noglob
изначально было от ksh, я полагаю, ).
Параметры — это просто специальные переменные вtcsh
(обратите внимание, что это также имело место вbash
(другой оболочке с наследием tcsh )изначально, пока она не изменилась на использование новой shopt
встроенной ), поэтому включите опцию, вы просто устанавливаете переменную:
set globstar
Подробнее см. man tcsh
.
.[].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"
Это решение обобщается для любого количества столбцов в моем ответе на дополнительный вопрос пользователя .