[英]Get the index of the array element in JSON with jq
我有以下类型的json:
{
"foo": "hello",
"bar": [
{
"key": "k1",
"val": "v1"
},
{
"key": "k2",
"val": "v2"
},
{
"key": "k3",
"val": "v3"
}
]
}
我想输出以下内容:
"hello", 1, "k1", "v1"
"hello", 2, "k2", "v2"
"hello", 3, "k3", "v3"
我正在使用jq转换这个,答案也应该是jq转换。
我目前在:
echo '{"foo": "hello","bar": [{"key": "k1","val": "v1"},{"key": "k2","val": "v2"},{"key": "k3","val": "v3"} ]}' | jq -c -r '.bar[] as $b | [.foo, ($b | .key, .val)] | @csv'
这给了我:
"hello","k1","v1"
"hello","k2","v2"
"hello","k3","v3"
我怎样才能获得索引来显示正在解析的数组元素?
您可以将数组转换为条目以访问索引和值。 然后,您可以构建CSV行。
$ jq -r '[.foo] + (.bar | to_entries[] | [.key+1,.value.key,.value.val]) | @csv' input.json
"hello",1,"k1","v1"
"hello",2,"k2","v2"
"hello",3,"k3","v3"
假设您可以访问jq 1.5并且键/ val键按顺序显示:
jq -r '.foo as $foo
| foreach .bar[] as $i (0; .+1; [$foo, .] + [$i[]])
| @csv'
会产生:
"hello",1,"k1","v1"
"hello",2,"k2","v2"
"hello",3,"k3","v3"
-r选项通常与@csv一起使用,以将由@csv生成的JSON字符串转换为以逗号分隔的值列表。
如果你真的想加入“,”,那么它有点麻烦,但如果你不担心@csv提供的功能,这里有一种方法:
$ jq -r '"\"\(.foo)\"" as $foo
| foreach .bar[] as $i
(0; .+1; "\($foo), \(.), \($i | map("\"\(.)\"")|join(", "))")'
这会产生:
"hello", 1, "k1", "v1"
"hello", 2, "k2", "v2"
"hello", 3, "k3", "v3"
如果你的jq没有foreach
那么你可以类似地使用reduce
,但它可能更容易升级。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.