JQ按键分组、合并值,然后展开对象

5

以下是需要输入的内容:

# file1.json
{
  "uid": "1",
  "name": "jack"
}
{
  "uid": "2",
  "name": "jill"
}

# file2.json
{
  "fid": "a",
  "file": "sample1.txt",
  "uid": "1"
}
{
  "fid": "b",
  "file": "sample2.txt",
  "uid": "1"
}
{
  "fid": "c",
  "file": "sample3.txt",
  "uid": "2"
}

我该如何在file2.json的对象中插入name键值对。我想要的输出结果如下:

{
  "fid": "a",
  "file": "sample1.txt",
  "uid": "1",
  "name": "jack"
}
{
  "fid": "b",
  "file": "sample2.txt",
  "uid": "1",
  "name": "jack"
}
{
  "fid": "c",
  "file": "sample3.txt",
  "uid": "2",
  "name": "jill"
}

使用 jq 合并 json 对象根据共同键连接两个 json 文件的解决方案中,似乎只返回最后一个匹配对。请参见以下内容。

{"uid":"1","name":"jack","fid":"b","file":"sample2.txt"}
{"uid":"2","name":"jill","fid":"c","file":"sample3.txt"}
1个回答

6
你需要" slurp(吞掉)" file1.json 文件,例如通过以下方式调用 jq:
jq -n -f merge.jq --slurpfile file1 file1.json file2.json

其中merge.jq包含如下内容:

INDEX($file1[]; .uid) as $dict
| inputs
| . + $dict[.uid]

def INDEX

如果你的 jq 没有 INDEX/2,那么只需添加其 def:

def INDEX(stream; idx_expr):
  reduce stream as $row ({}; .[$row|idx_expr|tostring] = $row);

感谢您的回复,但是尝试上述方法后,我遇到了以下错误: jq: error: INDEX/2 is not defined at <top-level>, line 1: INDEX($file1[]; .uid) as $dict jq: 1 compile errorjq 版本为 1.5。 - Dan Cruz
1
现在是升级到当前版本(1.6)的绝佳时机。否则,请参见上面更新的响应。 - peak
非常感谢!已升级到1.6版本,目前工作完美无缺。 - Dan Cruz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接