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
            ]
        }
    ]
}

这里有更大的样本:https://www.dropbox.com/s/0s0zjtxe01mecjc/AoQhRn%2B56KDm5AJJPwEvOTIwMDUyMC9hcmtfXzEyMTQ4X2JwdDZrMTAyNzY2Nw%3D%3D.json?dl=0

我可以使用以下命令提取 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 选项的 GNU parallel .

如果您知道 JSON 个感兴趣的文件在 pwd 中,您还可以通过指定 -maxdepth 1.

来加快 find