JQ播放片段:https://jqplay.org/s/D5-FZl8wOs
我使用jq来扁平化一个用于sql的json数组。
json:
{
"0123":[
{"i":0,"p":"file 1","l":100},
{"i":1,"p":"file 2","l":200}
],
"0234":[
{"i":0,"p":"file 1","l":100},
{"i":1,"p":"file 2","l":200}
]
}
jq:
jq -r to_entries[] | {hash: .key, val: .value[]} | [.hash, .val.i, .val.p, .val.l]
所需输出:
[
"0123",
0,
"file 1",
100
]
[
"0123",
1,
"file 2",
200
]
[
"0234",
0,
"file 1",
100
]
[
"0234",
1,
"file 2",
200
]
上面的方法只在文件很小的时候起作用,但是现在我得到内存错误/ OS在它变大的时候杀死它。
如果我传递--stream参数,我会得到错误:
jq: error (at <stdin>:9): Cannot index array with string "i"
我该如何解决这个问题呢?
发布于 2019-04-10 03:49:14
下面这样的代码将对您的示例输入执行。
foreach inputs as $pv ([[],[]]; # [A, B]
if ($pv|length) == 2 # if pv is a path-value pair
then .[0] |= if . == [] # if A is empty
then . + [$pv[0][0],$pv[1]] # add first key from path definition and the value located at path to A
else . + [$pv[1]] end # add value to A
else [[],.[0]] end; # move A to B's place, leave A empty
if .[0] == [] and .[1] != [] # if A is empty but B is not
then .[1] else empty end # print B
)
调用:
jq --stream -n 'foreach inputs as $pv ([[],[]]; if ($pv|length) == 2 then (.[0] |= if . == [] then . + [$pv[0][0],$pv[1]] else . + [$pv[1]] end) else [[],.[0]] end; if .[0] == [] and .[1] != [] then .[1] else empty end)' file
https://stackoverflow.com/questions/55598354
复制相似问题