我有一个问题,弄清楚我需要在jq中使用哪些过滤器和方法将我的json数据转换为我正在寻找的东西。我尝试的每一个组合最终要么根本不工作,要么为每个对象的每个子历法迭代每个值。
我在这方面花了太长时间,并没有取得任何进展。需要有人再戴上一双眼睛。我确信它比我正在做的更简单,但我无法弄明白!
这是我正在使用的json数据:
[
{
"location": "locationa",
"services": [
{
"name": "serviceA",
"version": "5.2.0.2",
"updatedAt": "2018-04-17"
},
{
"name": "serviceB",
"version": "4.19.0.5",
"updatedAt": "2018-04-17"
}
]
},
{
"location": "locationb",
"services": [
{
"name": "serviceA",
"version": "5.2.0.2",
"updatedAt": "2018-04-17"
},
{
"name": "serviceB",
"version": "4.19.0.5",
"updatedAt": "2018-04-17"
},
{
"name": "serviceC",
"version": "1.0.0.1",
"updatedAt": "2018-04-17"
}
]
}
]
这是我试图摆脱的格式:
locationa serviceA 5.2.0.2
locationa serviceB 4.19.0.5
locationb serviceA 5.2.0.2
locationb serviceB 4.19.0.5
locationb serviceC 1.0.0.1
你可以使用+
运算符连接字符串:
jq -r '.[]|.location+" "+(.services[]|.name+" "+.version)' file
locationa serviceA 5.2.0.2
locationa serviceB 4.19.0.5
locationb serviceA 5.2.0.2
locationb serviceB 4.19.0.5
locationb serviceC 1.0.0.1
通常在尝试输出csv / tsv时,您需要生成要输出的行数组,然后传递给@csv
或@tsv
或使用join/1
以您选择的格式输出。
jq -r '.[] | [.location] + (.services[] | [.name, .version]) | @tsv' input.json
作为替代方案,您可以考虑使用基于步行路径的unix实用程序jtc
:
bash $ <file.json jtc -x'<name>l:' -y'[-3][location]' -y' ' -y'[-1][version]' | xargs -L3
locationa serviceA 5.2.0.2
locationa serviceB 4.19.0.5
locationb serviceA 5.2.0.2
locationb serviceB 4.19.0.5
locationb serviceC 1.0.0.1
bash $