如何 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
非常大的 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