$ 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
Отвечая на мой собственный вопрос после игры с заданными ответами, общее решение для массивов json
jq --raw-output 'to_entries|map(.key),(map(.value)|transpose[])|@csv'
Решение с использованием функции transpose
:
<file jq -r '(to_entries|map(.key)),([.ObjectID,.Name,.Color,.Acidity]|transpose|.[])|@csv'
Имя объекта извлекается с помощью to_entries|map(.key)
.
Содержимое объекта помещается внутрь массива и transpose
d для получения массивов с элементами каждого объекта.
Затем результат обрабатывается оператором @csv
, который преобразует массив в строку, разделенную запятыми.