【问题标题】:jq combine output on a single line separated by spacejq 将输出组合在以空格分隔的单行上
【发布时间】:2019-07-05 06:41:28
【问题描述】:

我正在尝试在 Windows 机器上运行 jq 查询,它会从单独一行的输出中提取值

jq -r .Accounts[].Id

输出

204359864429
224271824096
282276286062
210394168456
090161402717

如何运行jq 查询,以便它将输出组合在由空格分隔的单行中

这就是我需要的-

204359864429 224271824096 282276286062 210394168456 090161402717

任何帮助将不胜感激。

【问题讨论】:

    标签: jq


    【解决方案1】:

    通常的方法是使用@csv@tsv 运算符将结果转换为CSV 或制表符分隔格式。这些运算符需要将结果包含在数组中。对于您的情况也有一个空格分隔,我们可以做一个简单的join(" ") 操作

    jq -r '[.Accounts[].Id]|join(" ")'
    

    【讨论】:

    • 那行不通。我正在运行这个 | jq -r '[.Accounts[].Id]|join(" ")' 这是我得到的错误。 jq:错误:语法错误,在 处出现意外 $end(Windows cmd shell 引用问题?),第 1 行:[.Accounts[].Id]|join( jq: 1 compile error
    • 在 Windows 上,您可以使用双引号来引用过滤器,或者使用 -f 选项来避免通常需要的所有问题。此外,本着minimal reproducible example 指导方针的精神,包含一个您提供给jq 的输入的最小示例通常是一个好主意。 @Inian 的回答基本上假设它是一个 JSON 对象。
    • 将输出包装在 () 中对我有用。来源:unix.stackexchange.com/questions/177843/…
    【解决方案2】:

    您可以使用@sh 格式化程序:

    jq -r ".Accounts[].Id | @sh"

    来自 jq 文档:

    输入被转义,适合在 POSIX shell 的命令行中使用。如果输入是一个数组,则输出将是一系列以空格分隔的字符串。

    参考:

    https://stedolan.github.io/jq/manual/#Basicfilters

    【讨论】:

      【解决方案3】:

      起初我认为上面的join() 解决方案不起作用。然后我意识到我正在“过度喂养”join() 过滤器,导致它失败,因为我提供的不仅仅是一个简单的数组作为输入。我已将多个过滤器与, 连接起来,但未能限制join() 的范围。

      没用:

      jq -r \
      '.ansible_facts |
       .ansible_hostname,
       .ansible_all_ipv4_addresses | join(" "),
       .ansible_local."aws-public-ipv4".publicIP'
      

      这给出了错误,

      jq: error (at <stdin>:0): Cannot iterate over string ("hostone")
      

      因为 jq 不仅试图“消费”ansible_all_ipv4_addresses,而且还试图“消费”前面的 ansible_hostname 过滤器的输出(我不确定这是为什么,或者它是否是 jq 的作者有意为之)。

      有效:

      jq -r \
      '.ansible_facts |
       .ansible_hostname,
       (.ansible_all_ipv4_addresses | join(" ")),
       .ansible_local."aws-public-ipv4".publicIP'
      

      在这里,我将join() 限制为仅.ansible_all_ipv4_addressesansible_all_ipv4_addresses 是我希望转换为单个空格分隔的字符串的 IP 地址数组)。


      P.S.:我发现@sh 过滤器会根据需要生成以空格分隔的输出,但另外用单引号分隔每个输出项


      附言: 这是我的解决方法,直到我发现join() 的工作原理与正确使用时相同(见上文):

      jq -r '.Accounts[].Id | @tsv | sub("\t";" ";"g")'
      

      解释@tsv 过滤器产生 Tab S分隔的 V 值,然后是 @987654337 @filter 用空格替换制表符,globally。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 2018-02-23
        • 1970-01-01
        • 2017-03-16
        相关资源
        最近更新 更多