首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >当与"--stream“选项一起使用时,小文件上的转换工作失败(由于文件大小而需要)

当与"--stream“选项一起使用时,小文件上的转换工作失败(由于文件大小而需要)
EN

Stack Overflow用户
提问于 2019-04-10 01:38:29
回答 1查看 99关注 0票数 4

JQ播放片段:https://jqplay.org/s/D5-FZl8wOs

我使用jq来扁平化一个用于sql的json数组。

json:

代码语言:javascript
复制
{
"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:

代码语言:javascript
复制
jq -r to_entries[] | {hash: .key, val: .value[]} | [.hash, .val.i, .val.p, .val.l]

所需输出:

代码语言:javascript
复制
[
  "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"

我该如何解决这个问题呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-10 03:49:14

下面这样的代码将对您的示例输入执行

代码语言:javascript
复制
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
)

调用:

代码语言:javascript
复制
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

jqplay:https://jqplay.org/s/Q81EZahkjG

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55598354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档