【问题标题】:How to use jq streaming for processing large array of objects and convert into array of objects如何使用 jq 流处理大型对象数组并转换为对象数组
【发布时间】:2020-09-21 09:21:40
【问题描述】:

我有一个 24 GB 的边缘大文件,其中包含 22M JSON 对象的数组。我必须对每个 JSON 对象进行一些操作并写入另一个文件。我正在使用以下命令

jq -cn --stream 'fromstream(1|truncate_stream(inputs))' test.json \
| jq -c ' if has ("middleName") then .sortableMiddleName=.middleName else . end | if has("middleName") then .middleName=[.middleName] else . end' \
> test_new.json

该命令可以正常工作,但输出包含由换行符分隔的 JSON 对象,并且没有父数组。例如,最初,文件的结构如下所示

[

object 1,
object 2,
........,
.........

]

文件处理后,输出文件的结构如下。

object 1

object 2

........

........

这里没有数组括号,而且每个对象都用换行符分隔。我想将其转换为原始结构,数组由逗号分隔的对象组成而不影响内存

感谢任何帮助

【问题讨论】:

    标签: arrays json linux stream jq


    【解决方案1】:

    以下回复可能对本案感兴趣(与此特定问题的具体情况相反) 输出数组足够小以适合内存。

    一种选择是将 jq 的第二次调用更改为这种形式:

    jq -nc '[inputs | .... ]'
    

    这里的 -n 选项与 inputs 一起使用,外部方括号将所有内容放入数组中。

    另一种可能性,同样基于上述假设,可能是将两个对 jq 的调用合并为一个:

    < data.json jq -cn --stream '
      [fromstream(1|truncate_stream(inputs))
       | if has ("middleName") then .sortableMiddleName=.middleName 
         else . end
         | if has("middleName") then .middleName=[.middleName] 
           else . end ]'
    
    

    【讨论】:

    • 感谢峰的帮助
    【解决方案2】:

    应该不需要调用 jq 两次,但是由于输出数组会很大,最好的办法可能是以一种时髦的方式将对象流转换为 JSON 数组,例如

    echo '['
    < data.json jq -nr --stream '
      fromstream(1|truncate_stream(inputs))
      | (if has ("middleName") then .sortableMiddleName=.middleName 
         else . end
         | if has("middleName") then .middleName=[.middleName] 
           else . end), ","' | sed '$d'
    echo ']'
    

    【讨论】:

      猜你喜欢
      • 2015-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      • 2022-10-07
      • 2023-01-24
      • 1970-01-01
      相关资源
      最近更新 更多