【问题标题】:How to skip first n objects in jq input如何跳过jq输入中的前n个对象
【发布时间】:2018-01-16 17:14:17
【问题描述】:

我有一个非常大的对象流,我正在尝试将其导入 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
]

欢迎提出任何建议。

【问题讨论】:

    标签: json stream jq skip


    【解决方案1】:
    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 是必要的,以避免在少于请求的项目数时出现错误。

    【讨论】:

    • 我喜欢这个答案,但我花了一点时间才理解它。 def skip(n): foreach inputs as $s (0; .+1; if . &gt; n then $s else empty end) ; skip(1000) 对我来说更清楚一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    相关资源
    最近更新 更多