jq将输出合并在由空格分隔的一行上

时间:2019-07-05 06:41:28

标签: jq

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

jq -r .Accounts[].Id

输出

204359864429
224271824096
282276286062
210394168456
090161402717

如何运行jq查询,以便将输出合并在用空格隔开的一行上

这就是我所需要的-

204359864429 224271824096 282276286062 210394168456 090161402717

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

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

通过jq文档:

  

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

参考:

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

答案 2 :(得分:0)

起初我认为上面的 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 地址数组)。


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


P.P.S.: 这是我的解决方法,直到我发现 join() 在正确使用时与它的工作方式相同(见上文):

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

解释@tsv 过滤器产生 Tab S 分离的 V alues,然后sub() 过滤器用空格替换制表符,g局部。