【问题标题】:JQ - Argument list too long error - Large InputJQ - 参数列表太长错误 - 大输入
【发布时间】:2021-02-23 08:40:27
【问题描述】:

我使用 Jq 对大型 json 文件执行一些过滤:

paths=$(jq '.paths | to_entries | map(select(.value[].tags | index("Filter"))) | from_entries' input.json)

并使用 :

将结果写入新文件
jq --argjson prefix "$paths" '.paths=$prefix' input.json > output.json

但是这个 ^ 失败了,因为 $paths 的行数非常高(大约 100,000 行)。

错误:

jq: Argument list too long

我也经历过:/usr/bin/jq: Argument list too long error bash,在那里理解同样的问题,但没有得到解决方案。

【问题讨论】:

  • 明确一点,当命令行包含太多字节时,“参数列表太长”是一个 shell(或真正的操作系统)错误。解决方案通常是使用命令行以外的其他方式在进程之间移动数据,或者在理想情况下避免在进程之间移动所有数据。

标签: shell command-line-arguments jq


【解决方案1】:

一般来说,假设您的 jq 允许,您可以使用 —argfile—slurpfile 但在您的情况下,您可以通过调用 jq 一次而不是两次来简单地避免该问题。例如,为了清楚起见:

 ( .paths | to_entries | map(select(.value[].tags | index("Filter"))) | from_entries ) as $prefix
 | .paths=$prefix

更好的是,只需使用|=

 .paths |= ( to_entries | map(select(.value[].tags | index("Filter"))) | from_entries)

或者更好的是,使用with_entries

【讨论】:

  • 我将尝试上述方法,发布确切的工作命令并接受此答案,谢谢。
猜你喜欢
  • 2020-05-08
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 2014-08-24
  • 2019-11-15
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
相关资源
最近更新 更多