jq可以在两个JSON对象列表中顺序添加对象吗?

ecfdbz9o  于 2023-03-04  发布在  其他
关注(0)|答案(3)|浏览(154)

我在寻找两个列表的同时迭代。
输入对象列表:

第一个输入对象列表

{
  "k11": "v111",
  "k12": "v112"
}
{
  "k11": "v121",
  "k12": "v122"
}
{
  "k11": "v131",
  "k12": "v132"
}

第二个输入对象列表

{
  "k21": "v211",
  "k22": "v212"
}
{
  "k21": "v221",
  "k22": "v222"
}
{
  "k21": "v231",
  "k22": "v232"
}

所需输出对象列表

{
  "k11": "v111",
  "k12": "v112"
  "k21": "v211",
  "k22": "v212"
}
{
  "k11": "v121",
  "k12": "v122"
  "k21": "v221",
  "k22": "v222"
}
{
  "k11": "v131",
  "k12": "v132"
  "k21": "v231",
  "k22": "v232"
}

两个对象列表之间没有匹配的键(可以很容易地转换成数组),谢谢你阅读这个问题。

2izufjch

2izufjch1#

一种方法是使用--slurpfile将文件作为数组读入,然后使用transposeadd "压缩"它们:

jq --slurpfile s1 file1.json --slurpfile s2 file2.json -n \
  '[$s1, $s2] | transpose[] | add'
{
  "k11": "v111",
  "k12": "v112",
  "k21": "v211",
  "k22": "v212"
}
{
  "k11": "v121",
  "k12": "v122",
  "k21": "v221",
  "k22": "v222"
}
{
  "k11": "v131",
  "k12": "v132",
  "k21": "v231",
  "k22": "v232"
}

两个对象列表(可以很容易地转换为数组)
如果这两个文件已经是数组,可以从使用--slurpfile转换到使用单个--slurp(或-s),然后将这些文件作为常规输入文件读入,并使用相同的"压缩"技术:

jq -s 'transpose[] | add' arrayfile1.json arrayfile2.json
6ss1mwsb

6ss1mwsb2#

如所接受的答案所示,解决该问题的一种方法是将两个流都转换为数组,但这强加了不必要的存储器要求,如以下解决方案所示,其要求两个流中的仅一个被“吸收”,并且顺便提一下,其也不会招致transpose的各种成本.

< s2 jq -n --slurpfile s1 s1 '
  def zips(s): 
    . as $in
    | foreach s as $x (-1; .+1; $in[.] + $x);
  $s1 | zips(inputs)'
vecaoik1

vecaoik13#

我知道这是作弊,我只是想看看它是否有效:一种壳体管道

paste -d+ <(jq -c . file1.json) <(jq -c . file2.json) \
| paste -sd, \
| xargs -0 jq -n

相关问题