如何使用jq检查JSON数组中是否存在元素,并将相应的对象放入新文件中
How to check if element(s) exist in JSON array using jq, and put the corresponding object into a new file
我在 ~50 URL 上执行 运行 curl 命令,每个命令都有 JSON 看起来像这样(但每个 curl 的 'country' 值不同命令,但 'names' 的值可能重复或唯一:
例如一个 curl 命令可以给出如下所示的 JSON:
{"names":["Mary","Tom","Sue","Rob"],"country":"USA"}
而下一个 curl 命令将给出:
{"names":["Sue"],"country":"Russia"}
下一个 curl 命令将给出:
{"names":["Tom","Jenny"],"country":"Nigeria"}
依此类推。
我有一个单独的姓名列表(例如 Tom、Sarah、Jenny、Trinh、Nancy),我想知道他们是否与 JSON 中任何一个国家相关联'm 运行 curl 命令开启。如果它们存在于“名称”中,我想将人名和国家/地区的名称放入一个新的文本文件(或 JSON 文件,没关系 - 我只是希望它的格式正确),所以在结束 我有一个输出文件,将人名和他们所属的国家联系起来。如果一个国家有多个人,输出文件中的国家不应该有重复的值;人民的名字应该列在那个国家下面。
我已经尝试了多种方法来解决这个问题,但我无法弄清楚,因为这是我第一次尝试编写脚本。
我尝试的最后一个命令:
curl "https://..." | jq -r 'select(.names[] as $a | ["Tom","Sarah","Jenny","Trinh","Nancy"] | index($a) | while read output; do tee -a listOfCountries; done; done
^这给出了重复项,我不确定如何格式化输出,以便每个输出之间有空格,并且该国家/地区 只有 它下面的人的具体名字
输出文件(上面给出的例子)应该是这样的:
USA: Tom
Nigeria: Tom, Jenny
如果您有任何建议,请告诉我,我们将不胜感激。谢谢!
附带问题:如果要搜索的姓名列表非常长(超过 100 个姓名),编写此脚本的最佳方式是什么?
将所有 JSON 个对象放在一个文件中,比如 output.jsons:
jq -c -n --argjson list '[ "Tom", "Sarah", "Jenny", "Trinh", "Nancy"]' '
(reduce inputs as $in ({}; reduce $in.names[] as $name (.; .[$name] += [$in.country]))) as $dict
| reduce $list[] as $name ({};
if $dict[$name]
then reduce $dict[$name][] as $country (.; .[$country] += [$name])
else . end)
' output.jsons
产生:
{"USA":["Tom"],"Nigeria":["Tom","Jenny"]}
您可以轻松地将其转换为所需的输出。
确保每个数组元素唯一性的一种方法是将以下内容附加到过滤器:map_values(unique)
.
关于附带问题:您可以使用 --argfile 或 --slurpfile 而不是 --argjson。
我在 ~50 URL 上执行 运行 curl 命令,每个命令都有 JSON 看起来像这样(但每个 curl 的 'country' 值不同命令,但 'names' 的值可能重复或唯一:
例如一个 curl 命令可以给出如下所示的 JSON:
{"names":["Mary","Tom","Sue","Rob"],"country":"USA"}
而下一个 curl 命令将给出:
{"names":["Sue"],"country":"Russia"}
下一个 curl 命令将给出:
{"names":["Tom","Jenny"],"country":"Nigeria"}
依此类推。
我有一个单独的姓名列表(例如 Tom、Sarah、Jenny、Trinh、Nancy),我想知道他们是否与 JSON 中任何一个国家相关联'm 运行 curl 命令开启。如果它们存在于“名称”中,我想将人名和国家/地区的名称放入一个新的文本文件(或 JSON 文件,没关系 - 我只是希望它的格式正确),所以在结束 我有一个输出文件,将人名和他们所属的国家联系起来。如果一个国家有多个人,输出文件中的国家不应该有重复的值;人民的名字应该列在那个国家下面。
我已经尝试了多种方法来解决这个问题,但我无法弄清楚,因为这是我第一次尝试编写脚本。
我尝试的最后一个命令:
curl "https://..." | jq -r 'select(.names[] as $a | ["Tom","Sarah","Jenny","Trinh","Nancy"] | index($a) | while read output; do tee -a listOfCountries; done; done
^这给出了重复项,我不确定如何格式化输出,以便每个输出之间有空格,并且该国家/地区 只有 它下面的人的具体名字
输出文件(上面给出的例子)应该是这样的:
USA: Tom
Nigeria: Tom, Jenny
如果您有任何建议,请告诉我,我们将不胜感激。谢谢!
附带问题:如果要搜索的姓名列表非常长(超过 100 个姓名),编写此脚本的最佳方式是什么?
将所有 JSON 个对象放在一个文件中,比如 output.jsons:
jq -c -n --argjson list '[ "Tom", "Sarah", "Jenny", "Trinh", "Nancy"]' '
(reduce inputs as $in ({}; reduce $in.names[] as $name (.; .[$name] += [$in.country]))) as $dict
| reduce $list[] as $name ({};
if $dict[$name]
then reduce $dict[$name][] as $country (.; .[$country] += [$name])
else . end)
' output.jsons
产生:
{"USA":["Tom"],"Nigeria":["Tom","Jenny"]}
您可以轻松地将其转换为所需的输出。
确保每个数组元素唯一性的一种方法是将以下内容附加到过滤器:map_values(unique)
.
关于附带问题:您可以使用 --argfile 或 --slurpfile 而不是 --argjson。