String 为什么jq--raw输出参数无法从@csv输出中删除引号?

String 为什么jq--raw输出参数无法从@csv输出中删除引号?,string,csv,jq,quotes,ffprobe,String,Csv,Jq,Quotes,Ffprobe,我试图使用jq将ffprobe生成的JSON输出的一些元素重新格式化为csv。我很接近(在我看来),但仍在为一个细节而挣扎: 我的 我最近在MacOS Mojave(10.14.6)上运行了一个jq的d/l二进制(jq--version=>jq-1.6) 从Mac上的终端,我的结果是: $fn_ffprobeall | jq-r'[.format.filename、.format.format_name、.format.tags.album_artist]|@csv' “01周年纪念,佛罗里达州

我试图使用
jq
ffprobe
生成的JSON输出的一些元素重新格式化为
csv
。我很接近(在我看来),但仍在为一个细节而挣扎:

我的

我最近在MacOS Mojave(10.14.6)上运行了一个jq的d/l二进制(
jq--version
=>
jq-1.6

从Mac上的终端,我的结果是:

$fn_ffprobeall | jq-r'[.format.filename、.format.format_name、.format.tags.album_artist]|@csv'
“01周年纪念,佛罗里达州”,“佛罗里达州”,“比尔·查拉普三重奏”
#其中fn_ffprobeall是一个函数,定义为:
fn_ffprobeall(){ffprobe-i“01 Jubilee.flac”-hide_banner-v quiet-print_format json-show_format-show_streams;}
但是这个
jq
输出(如上所示)不是我需要的。。。我需要不带引号的值
。根据for
——原始输出/-r

使用此选项,如果过滤器的结果是字符串,那么它将直接写入标准输出,而不是格式化为带引号的JSON字符串。这对于使jq过滤器与非基于JSON的系统进行通信非常有用


此外,使用
@tsv
而不是
@csv
“做正确的事情”似乎有些奇怪,因为引号将被删除。我想人们可以做一些额外的工作,用
替换
选项卡
字符,但我想知道在回到那种方法之前我是否遗漏了什么。

通常,
@csv
过滤器按照流行的标准生成csv,这些标准要求在某些情况下引用字符串(例如,如果它们包含逗号),并且允许引用字段

jq的-r选项被误解了很多。它只影响“顶级”JSON字符串输出。它应该与
@csv
选项一起使用以生成csv输出,但它不会从字符串值字段中去掉引号

如果您想对引号的显示位置进行细粒度控制,您有许多选项(最简单的选项之一是
@tsv|gsub(“\\t”;”,”)
),但您将面临生成无效CSV的风险。

--raw output
选项对传递给
@CSV
的字符串没有控制权,因为此时它们不是筛选器的最终结果。引用它们是因为
@CSV
引用了它们

jq
@csv
的结果视为单个字符串输出值。
--raw output
选项按照文档中的说明工作,它不会将输出中的字符串结果编码为JSON

如果您尝试不使用该选项,您将看到输出为
“\“01 Jubilee.flac\”、“flac\”、“Bill Charlap Trio\”
,这是一个正确编码的JSON字符串。它包含引号以及转义的不允许字符。 只需在上选中并取消选中
Raw Output
选项,就可以看到这种差异


如果你想在CSV中使用不带引号的字符串,你可以使用
join(“,”)
来代替
@CSV
,但是如果某个字符串本身有逗号,它将无法正常工作。

好的,公平的说,“标准”有点粘。在阅读你的答案后,我发现这增加了一些见解。你的答案是,“
jq的-r选项被误解得太多了。它应该是……
”我可能不明白你想说什么……我确实将它与
@csv
选项一起使用,文档中确实有明确的说明(当我读它们时)引号将被删除。你能澄清什么是被误解的吗?你如何将其与文档进行平方比较?:
使用此选项,如果过滤器的结果是字符串,那么它将直接写入标准输出,而不是格式化为带引号的JSON字符串。
也许这就是我们的共同点:心智障碍?我理解你的解释-这是有道理的。我希望
jq
文档能够清楚:)和fwiw,我试图使用Excel将字符串作为一行添加到现有的CSV文件中。