如何 select 大型 json 文件中的特定数据并以相同的结构保存结果

How to select specific data in a large json file and save the result with same structure

非常大的 Json 文件 (3Gb),如下所示:

  {
    "listPoint": [{
            "Paime": "RE6845",
            "rmOi": "SNO-55",
            "State": "OPEN",
            "dateOpneing": "2017-12-22",
            "adress": {
                "ZIPCODE": "33410",
                "codeRoc": "33105"
            }
        },

        {
            "Paime": "RE6243",
            "rmOi": "SNO-65",
            "State": "OPEN",
            "dateOpneing": "2014-11-12",
            "adress": {
                "ZIPCODE": "453410",
                "codeRoc": "35105"
            }
        }

    ]
}

我正在尝试将其过滤到另一个具有相同结构的文件,条件是所有 ZIPCODES 必须属于特定列表:

  ['33410', '42000', '75015'....]

结果应该是这样的(输出文件必须与输入的结构相同):

 {
        "listPoint": [{
                "Paime": "RE6845",
                "rmOi": "SNO-55",
                "State": "OPEN",
                "dateOpneing": "2017-12-22",
               "adress": {
                "ZIPCODE": "33410",
                "codeRoc": "35105"
            },
    
            {
                "Paime": "RE6243",
                "rmOi": "SNO-65",
                "State": "OPEN",
                "dateOpneing": "2014-11-12",
                "ZIPCODE": "75015",
                "codeRoc": "55115"
            }
        .....
    
        ]
    }

我试过这个但是它流式传输了所有文件:

./jq-win64.exe -n --stream 'fromstream(0|truncate_stream(inputs))' test1.json

我不知道该怎么做请你帮忙

(1) 如果您的计算机有足够的 RAM,那么最简单的解决方案是:

< very-large-file.json jq '
  .listPoint |= map(select(.ZIPCODE|startswith("33")))'

(2) 否则,您可以在 two-step 解决方案中使用 jq 的流解析器,例如:

< very-large-file.json jq -n --stream '
    fromstream(2|truncate_stream(inputs))
    | select(.ZIPCODE|startswith("33"))' |
  jq -s '{listPoint: .}'

第一步,生成相关JSON对象的流;在第二步中,这些 re-assembled 进入所需的结构。

(3) 如果风选数组太大而无法放入内存,那么你可以做的比以下更糟:

echo '{listPoint:'
< very-large-file.json jq -n --stream '
    fromstream(2|truncate_stream(inputs))
    | select(.ZIPCODE|startswith("33"))' |
  jq -ncr 'input, (inputs | ",", .)'
echo '}'

(4) 如果您想 select 基于白名单的邮政编码,请更改 selection 标准,例如至

.ZIPCODE|IN($whitelist[])

——-

注意:如果您的 shell 不够 bash-like,您可能会发现使用以下调用格式更好:

jq OPTIONS -f program.jq INPUT.json