Почему аргумент jq --raw-output не может удалить кавычки из вывода @csv? - PullRequest
0 голосов
/ 22 февраля 2020

Я пытаюсь использовать jq для переформатирования некоторых элементов вывода JSON, сгенерированного ffprobe как csv. Я близок (кажется мне), но борюсь с деталями:

Мой ffprobe вывод показан на детской площадке jq 1.6

Я запуск недавно d / l двоичного файла jq (jq --version => jq-1.6) на MacOS Mojave (10.14.6)

Из терминала на моей Ma c мои результаты:

$ fn_ffprobeall | jq -r '[.format.filename,.format.format_name,.format.tags.album_artist] | @csv'
"01 Jubilee.flac","flac","Bill Charlap Trio"

# where fn_ffprobeall is a function defined as: 
fn_ffprobeall () { ffprobe -i "01 Jubilee.flac" -hide_banner -v quiet -print_format json -show_format -show_streams; }

Но этот вывод jq (показанный выше) - не то, что мне нужно ... Мне нужны значения без окружающих кавычек "". Согласно документации для --raw-output / -r:

При использовании этой опции, если результат фильтра является строкой, он будет записан непосредственно в стандартный вывод, а не отформатирован как JSON строка с кавычками. Это может быть полезно для общения jq-фильтров с системами, не основанными на JSON.

Кроме того, кажется странным, что использование @tsv вместо @csv " делает правильную вещь ", поскольку кавычки будут удалены. Я полагаю, можно было бы проделать дополнительную работу, чтобы заменить tab символов на ,, но я хотел бы знать, если я что-то упустил, прежде чем вернуться к этому подходу.

1 Ответ

0 голосов
/ 22 февраля 2020

Фильтр @csv генерирует CSV в целом в соответствии с преобладающими стандартами, которые требуют, чтобы строки заключались в кавычки при определенных обстоятельствах (например, если они содержат запятые), и которые допускают кавычки для полей.

jq's Опция -r очень неправильно понята. Влияет только на строковые выходные данные верхнего уровня JSON. Его следует использовать с параметром @csv для создания выходных данных CSV, но он не удаляет кавычки из строковых полей.

Если вы хотите иметь точный контроль над тем, где появляются кавычки, вы есть множество вариантов (одним из самых простых является @tsv | gsub("\\t";",")), но вы рискуете получить недопустимый CSV.

...