我试图解析JSON文档并在同一行上打印几个值。有没有办法采取以下文件:
{
"fmep": {
"foo": 112,
"bar": 234324,
"cat": 21343423
}
}
吐出来:
112 234324
我可以获得我想要的值,但它们会分开打印:
$ echo '{ "fmep": { "foo": 112, "bar": 234324, "cat": 21343423 } }' | jq '.fmep|.foo,.bar'
112
234324
如果有一个示例显示如何执行此操作,我将不胜感激。
答案 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工具的创建者