【发布时间】:2020-12-11 21:25:12
【问题描述】:
我正在尝试通过 bash 中的 jq 从 json 中获取一些价值。小值它工作得很好,但大 json 工作太慢,比如每 2-3 秒 1 个值。我的代码示例:
json=$(curl -s -A "some useragent" "url" )
pid=$(cat idlist.json | jq '.page_ids[]')
for id in $pid
do
echo $pagejson|jq -r '.page[]|select(.id=='$id')|.url'>>path.url
done
“pid”是我在运行脚本之前输入的 id 列表。它可能包含 700-1000 个 ID。 json的示例对象
{
"page":[
{
"url":"some url",
"id":some numbers
},
{
"url":"some url",
"id":some numbers
}
]
}
有什么方法可以加快速度吗?在 javascript 中它的工作速度比它快。 javascript示例:
//First sort object with order
var url="";
var sortedjson= ids.map(id => obj.find(page => page.id === id));
//Then collect url
for ( x=0 ; x < sortedjson.length;x++) {
url+=sortedjson[x].url
};
我应该像在 javascript 中那样对 json 进行排序以获得更好的性能吗?我没有尝试过,因为不知道如何。
编辑:
将“pid”变量替换为 json 以使用更少的代码,并将 for id in $(echo $pid) 替换为 for id in $pid。
但是如果 id list 超过 50 左右,它仍然会变慢
【问题讨论】:
-
与您的性能问题无关,但
echo $pagejson |可能会损坏您的数据。总是总是引用你的扩展;echo "$pagejson" |不会扩展 glob、合并空格等。 -
啊,编辑后好多了;这确实解释了它为什么起作用,以及为什么它很慢。
-
(顺便说一句,
for id in $(echo $pid)只是写for id in $pid的一种较慢的方式;您可以在 IFS 上进行拆分,而无需任何命令替换)。 -
顺便说一句,请注意,要获得经过测试的答案,您需要提供足以进行测试的示例输入;它需要是真正的 JSON,而不是伪代码,需要包含与示例中的数字一致的数字等。
-
...您最近所做的编辑——在我添加了我的答案之后——似乎反映了我的 cmets,而不是我的答案。只有预期的答案才能真正解决您的问题; cmets只是旁白。 (如果我认为他们会解决你的问题,我会把它们放在答案中!)
标签: json bash select jq processing-efficiency