jq:按值(包含)过滤结果非常慢
jq: filter result by value (contains) is very slow
我正在尝试使用 jq 过滤大量 JSON 文件并提取属于特定域的每个对象的 ID,以及该域中的完整 URL .这是数据示例:
{
"items": [
{
"completeness": 5,
"dcLanguageLangAware": {
"def": [
"de"
]
},
"edmIsShownBy": [
"https://gallica.example/image/2IC6BQAEGWUEG4OP7AYBDGIGYAX62KZ6H366KXP2IKVAF4LKY37Q/presentation_images/5591be60-01fc-11e6-8e10-fa163e091926/node-3/image/SBB/Berliner_Börsenzeitung/1920/02/27/F_065_098_0/F_SBB_00007_19200227_065_098_0_001/full/full/0/default.jpg"
],
"id": "/9200355/BibliographicResource_3000117730632",
"type": "TEXT",
"ugc": [
false
]
}
]
}
我可以使用以下命令提取 id 和包含字符串“gallica”的 URL:
jq '[ .items[] | select(.edmIsShownBy[] | contains ("gallica")) | {id: .id, link: .edmIsShownBy[] }]'
但是,我有超过 28000 个 JSON 个文件要处理,并且需要花费大量时间(大约每分钟 1 个文件)。我正在使用 bash 和命令处理文件:
find . -name "*.json" -exec cat '{}' ';' | jq '[ .items[] | select(.edmIsShownBy[] | contains ("gallica")) | {id: .id, link: .edmIsShownBy[] }]'
我想知道缓慢是否是由于给 jq 的指令造成的,如果是这样,是否有更快的方法来过滤所选值中包含的字符串?有什么想法吗?
最好不要尝试一次 cat
所有文件;事实上,最好完全避免 cat
。
例如,假设 program.jq 包含您决定的任何 jq 程序(这里使用 contains
没有任何问题),您可以尝试:
find . -name "*.json" -exec jq -f program.jq '{}' +
使用非标准 + 而不是“;”最小化必须调用 jq 的次数,尽管调用 jq 的开销实际上非常小。如果您的 find
不支持 +
并且您希望避免为每个文件调用一次 jq,那么请考虑使用 xargs,或带有 —-xargs
选项的 GNU parallel
.
如果您知道 JSON 个感兴趣的文件在 pwd 中,您还可以通过指定 -maxdepth 1
.
来加快 find
我正在尝试使用 jq 过滤大量 JSON 文件并提取属于特定域的每个对象的 ID,以及该域中的完整 URL .这是数据示例:
{
"items": [
{
"completeness": 5,
"dcLanguageLangAware": {
"def": [
"de"
]
},
"edmIsShownBy": [
"https://gallica.example/image/2IC6BQAEGWUEG4OP7AYBDGIGYAX62KZ6H366KXP2IKVAF4LKY37Q/presentation_images/5591be60-01fc-11e6-8e10-fa163e091926/node-3/image/SBB/Berliner_Börsenzeitung/1920/02/27/F_065_098_0/F_SBB_00007_19200227_065_098_0_001/full/full/0/default.jpg"
],
"id": "/9200355/BibliographicResource_3000117730632",
"type": "TEXT",
"ugc": [
false
]
}
]
}
我可以使用以下命令提取 id 和包含字符串“gallica”的 URL:
jq '[ .items[] | select(.edmIsShownBy[] | contains ("gallica")) | {id: .id, link: .edmIsShownBy[] }]'
但是,我有超过 28000 个 JSON 个文件要处理,并且需要花费大量时间(大约每分钟 1 个文件)。我正在使用 bash 和命令处理文件:
find . -name "*.json" -exec cat '{}' ';' | jq '[ .items[] | select(.edmIsShownBy[] | contains ("gallica")) | {id: .id, link: .edmIsShownBy[] }]'
我想知道缓慢是否是由于给 jq 的指令造成的,如果是这样,是否有更快的方法来过滤所选值中包含的字符串?有什么想法吗?
最好不要尝试一次 cat
所有文件;事实上,最好完全避免 cat
。
例如,假设 program.jq 包含您决定的任何 jq 程序(这里使用 contains
没有任何问题),您可以尝试:
find . -name "*.json" -exec jq -f program.jq '{}' +
使用非标准 + 而不是“;”最小化必须调用 jq 的次数,尽管调用 jq 的开销实际上非常小。如果您的 find
不支持 +
并且您希望避免为每个文件调用一次 jq,那么请考虑使用 xargs,或带有 —-xargs
选项的 GNU parallel
.
如果您知道 JSON 个感兴趣的文件在 pwd 中,您还可以通过指定 -maxdepth 1
.
find