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

Posted

技术标签:

【中文标题】如何跳过jq输入中的前n个对象【英文标题】:How to skip first n objects in jq input 【发布时间】: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
]

欢迎提出任何建议。

【问题讨论】:

【参考方案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) 对我来说更清楚一点。

以上是关于如何跳过jq输入中的前n个对象的主要内容,如果未能解决你的问题,请参考以下文章

跳过每组中的前 n 行

标准查询运算符---LINQ

JQ:计算每个组的对象数,用于输入的子集

将数据导入 Access 时如何跳过 Excel 中的前几行?

如何仅显示列表中的前 10 个输入?

提取数字前的前几个字母并跳过其余字母