Преобразование JSON массивов в CSV с заголовками с помощью JQ

$ printf '%s\n' A B C D
A
B
C
D

Команда printf, встроенная -в команду в большинстве оболочек, принимает строку форматирования, содержащую один или несколько заполнителей. Строка %sявляется заполнителем для «строки» (, которая чаще всего используется в оболочке ). Если для printfзадано больше аргументов, то в строке формата (есть заполнители, как в этом случае ), вся строка формата будет применяться снова и снова, пока список аргументов не будет исчерпан. Поскольку в конце строки формата есть символ новой строки\n(), каждая буква будет располагаться на отдельной строке.

Если у вас есть строка в переменной:

str='A B C D'
printf '%s\n' $str

Это будет иметь тот же результат, что и выше. Расширение $strне заключено в кавычки, что означает, что содержимое строки будет разбито на пробелы (символы в переменной IFSбудут использоваться для разделения строки на слова, и эта переменная по умолчанию содержит пробел, табуляция и новая строка ). Обратите внимание, что если строка содержит подстановочные символы имени файла, такие как *, то будут выведены имена файлов, соответствующие этим шаблонам. Установив параметр оболочки noglob(с помощью set -fили set -o noglob), вы можете избежать этого:

str='A B C D *'
set -f
printf '%s\n' $str
set +f
2
30.01.2020, 22:33
2 ответа

Отвечая на мой собственный вопрос после игры с заданными ответами, общее решение для массивов json

jq --raw-output 'to_entries|map(.key),(map(.value)|transpose[])|@csv'   
2
28.04.2021, 23:25

Решение с использованием функции transpose:

<file jq -r '(to_entries|map(.key)),([.ObjectID,.Name,.Color,.Acidity]|transpose|.[])|@csv'

Имя объекта извлекается с помощью to_entries|map(.key).

Содержимое объекта помещается внутрь массива и transposed для получения массивов с элементами каждого объекта.

Затем результат обрабатывается оператором @csv, который преобразует массив в строку, разделенную запятыми.

1
28.04.2021, 23:25

Теги

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