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



我正在尝试使用jqffprobe生成的 JSON 输出的某些元素重新格式化为csv.我很接近(在我看来),但在一个细节上挣扎:

我的ffprobe输出显示在 jq 1.6 操场中

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

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

$ 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字符,但我想知道在回退到这种方法之前我是否遗漏了什么。

--raw-output选项无法控制传递给@csv的字符串,因为到那时,它们不是过滤器的最终结果。他们被引用是因为@csv引用了他们。

jq@csv的结果视为单个字符串输出值。--raw-output选项的工作方式如文档中所述,它不会将字符串结果编码为 JSON 输出。

如果您尝试不使用该选项,您将看到输出为""01 Jubilee.flac","flac","Bill Charlap Trio"",这是一个正确编码的 JSON 字符串。它有引号,以及不允许的字符转义。 您只需选中和取消选中 https://jqplay.org/s/OerK1MlARS 的Raw Output选项即可看到这种差异。

如果你想要CSV中不带引号的字符串,你可以用join(",")代替@csv,但是当某些字符串本身有逗号时,它将无法正常工作。

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

JQ 的 -R 选项被误解了很多。它仅影响"顶级"JSON 字符串输出。 它应与@csv选项一起使用以生成 CSV 输出,但它不会从字符串值字段中去除引号。

如果要对引号的显示位置进行细粒度控制,则有许多选项(最简单的选项之一是@tsv | gsub("\t";",")),但随后会冒生成无效CSV的风险。

最新更新