在同一行上打印多个值

时间:2017-09-09 14:31:24

标签: json jq

我试图解析JSON文档并在同一行上打印几个值。有没有办法采取以下文件:

{
  "fmep": {
    "foo": 112,
    "bar": 234324,
    "cat": 21343423
  }
}

吐出来:

112 234324

我可以获得我想要的值,但它们会分开打印:

$ echo '{ "fmep": { "foo": 112, "bar": 234324, "cat": 21343423 } }' | jq '.fmep|.foo,.bar'

112  
234324

如果有一个示例显示如何执行此操作,我将不胜感激。

3 个答案:

答案 0 :(得分:14)

您示例中最简单的方法是使用String Interpolation-r选项。 e.g。

echo '{ "fmep": { "foo": 112, "bar": 234324, "cat": 21343423 } }' | \
jq -r '.fmep| "\(.foo) \(.bar)"'

产生

112 234324

您可能还想考虑将值放在数组中并使用@tsv例如

echo '{ "fmep": { "foo": 112, "bar": 234324, "cat": 21343423 } }' | \
jq -r '.fmep | [.foo, .bar] | @tsv'

生成制表符分隔

112 234324

答案 1 :(得分:0)

以下是使用连接输出(-j)的语法:

jq -j '.fmep | .foo, " ", .bar, "\n"' payload.json

答案 2 :(得分:0)

现在还有一个替代的步行路径unix实用程序,用于处理JSON- jtc ,它为用户界面提供了一种新颖的方式:查询被编码为步行路径本身

上面的查询如下所示:

bash $ echo '{ "fmep": { "foo": 112, "bar": 234324, "cat": 21343423 } }' | \
jtc -w'[fmep][foo]<f>v[-1][bar]' -T'"{f} {}"' -qq
112 234324
bash $ 

步行路径(-w)由寻址词素[..]和搜索/指令<..>组成(无论是搜索还是指令由lexeme的单字母后缀定义) ,这里:

  • [fmep][foo]-从根开始,以标签fmep命名,然后以foo命名
  • <f>v-记住在命名空间f中找到的JSON值(后缀v指示这样做)
  • [-1][bar]-解决最后找到的值的父项(是的,负偏移使向上遍历JSON树),然后解决标签bar

步行结果可能会经过可选的模板插值(-T):

  • {f}-插值命名空间f中的存储值
  • {}-内插最近发现的值(因此无需记住它)

模板插值的结果仍然必须是有效的JSON-在这种情况下,它是一个字符串。结果JSON字符串被打印出来,-qq指示取消对它的引用。

PS>披露:我是jtc-用于JSON操作的shell cli工具的创建者