如何跳过jq输入中的前n个对象

时间:2017-08-09 01:00:28

标签: json stream jq skip

我有一个非常大的对象流,我试图将其导入MongoDB。在大约10k个对象之后我不断收到破损的管道,所以我希望能够更新我的导入脚本以跳过已导入的对象,并从第一个错过的对象开始。

在我看来,这个工具将是jq。我需要的是一种在 n 之前跳过(产生空)所有项目的方法,然后按原样输出其余项目。

我已经尝试使用foreach来维护一个对象计数器,但是对于我的小测试样本中的所有对象(在这里使用bash文档),我一直以1作为计数器的值结束:

$ jq 'foreach . as $item (0; (.+1); [ . , if . < 2 then empty else $item end ])' <<"end"
> { "item": "first" }
> { "item": "second" }
> { "item": "third" }
> { "item": "fourth" }
> end

这个输出是:

[
  1
]
[
  1
]
[
  1
]
[
  1
]

欢迎任何建议。

1 个答案:

答案 0 :(得分:3)

def skip(n; stream):
  foreach stream as $s (0; .+1; select(. > n) | $s);

示例:

skip(1000; inputs)

(使用inputs和/或input时,不要忘记您可能希望使用-n命令行选项。)

大锤方法

try (range(0; 1000) | input | empty), inputs

在这种情况下,try是必要的,以避免错误,如果少于请求的项目数。