如何使用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。