如何跳过 jq 输入中的前 n 个对象
How to skip first n objects in jq input
我有一个非常大的对象流,我正试图将其导入 MongoDB。在大约 10k 个对象之后,我的管道不断损坏,因此我希望能够更新我的导入脚本以跳过已经导入的对象并从第一个丢失的对象开始。
在我看来,这方面的工具是 jq。我需要的是一种跳过(yield empty)第 n 之前的所有项目,然后按原样输出其余项目的方法。
我试过使用 foreach 来维护一个对象计数器,但对于我的小测试样本中的所有对象,我一直以 1 作为计数器的值结束(使用 bash 此处文档) :
$ 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
]
欢迎提出任何建议。
def skip(n; stream):
foreach stream as $s (0; .+1; select(. > n) | $s);
示例:
skip(1000; inputs)
(使用 inputs
and/or input
时,请不要忘记您可能需要使用 -n 命令行选项。)
大锤方法
try (range(0; 1000) | input | empty), inputs
在这种情况下,try
是必要的,以避免在项目数量少于请求的数量时出现错误。
我有一个非常大的对象流,我正试图将其导入 MongoDB。在大约 10k 个对象之后,我的管道不断损坏,因此我希望能够更新我的导入脚本以跳过已经导入的对象并从第一个丢失的对象开始。
在我看来,这方面的工具是 jq。我需要的是一种跳过(yield empty)第 n 之前的所有项目,然后按原样输出其余项目的方法。
我试过使用 foreach 来维护一个对象计数器,但对于我的小测试样本中的所有对象,我一直以 1 作为计数器的值结束(使用 bash 此处文档) :
$ 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
]
欢迎提出任何建议。
def skip(n; stream):
foreach stream as $s (0; .+1; select(. > n) | $s);
示例:
skip(1000; inputs)
(使用 inputs
and/or input
时,请不要忘记您可能需要使用 -n 命令行选项。)
大锤方法
try (range(0; 1000) | input | empty), inputs
在这种情况下,try
是必要的,以避免在项目数量少于请求的数量时出现错误。