【发布时间】:2020-11-14 14:06:04
【问题描述】:
在 *nix 环境中。我正在寻找关于如何将文件中的一些(不太有效)json 添加到另一个(有效)json 文件的解决方案。让我详细说明一下,并介绍迄今为止我尝试过的一些失败的尝试。
这将在 shell 脚本中循环运行,该循环会变得非常大。它正在进行一次只能返回 1000 个的 api 调用。但是,总共有 70,000,000 多条记录。因此,我必须调用这个 api 70,000 次才能获得所有需要的记录。我要保留的原始 json 文件,它包含我想要的实际数据之外的信息,例如结果信息和成功消息等。每次我迭代并调用下一组时,我都试图删除该信息并只需将主要数据记录附加到第一组的主要数据记录即可。
我已经完成了 99%。我正在尝试使用 jq sed 和 python。数据记录的主体在技术上不是有效的 json。所以jq 抱怨,因为它只能附加有效数据。我的尝试看起来像这样jq --argjson results "$(<new.json)" '.result[] += [$results]' original.json。但如果是这样,那么它将是有效的 json。
我已经使用grep -n 抽象出我想开始将新记录集附加到第一组记录的行号。所以我一直在尝试使用sed,但无法找出正确的语法。虽然我觉得我很接近。我一直在尝试类似sed -i -e $linenumber '<a few sed things here> new.json' original.json 的东西。但还没有成功。
我现在尝试编写一个python 脚本来执行此操作。但我以前从未尝试过这样的事情。只是在 readlines 和字符串替换上进行了一些字符串匹配。我没有意识到没有用于跳转到特定行的内置方法。我想我可以做一些 find 语句来跳转到 python 中的那一行,但我已经在 bash 脚本中完成了这个。另外,我意识到我可以将python 中的每一行读入内存,但我担心有这么多记录,它可能会变得太多并且变得非常慢。
我对尝试某种head 和tail 有过一些想法,并写在两者之间,因为我知道确切的行号。欢迎使用任何工具/语言的任何想法或解决方案。这是一个 devops 项目,只是为了诊断一些日志,所以我试图不把它变成一个完整的项目,因为一旦我生成了日志,我将把所有的注意力和精力转移到针对这个最终生成的 json 运行命令文件并且不再真正使用此脚本。
original.json 的示例
{
"result": [
{
"id": "5b5915f4cdb39c7b",
"kind": "foo",
"source": "bar",
"action": "baz",
"matches": [
{
"id": "b298ee91704b489b8119c1d604a8308d",
"source": "blah",
"action": "buzz"
}
],
"occurred_at": "date"
},
{
"id": "5b5915f4cdb39c7b",
"kind": "foo",
"source": "bar",
"action": "baz",
"matches": [
{
"id": "b298ee91704b489b8119c1d604a8308d",
"source": "blah",
"action": "buzz"
}
],
"occurred_at": "date"
}
],
"result_info": {
"cursors": {
"after": "dlipU4c",
"before": "iLjx06u"
},
"scanned_range": {
"since": "date",
"until": "date"
}
},
"success": true,
"errors": [],
"messages": []
}
new.json 示例
{
"id": "5b5915f4cdb39c7b",
"kind": "foo",
"source": "bar",
"action": "baz",
"matches": [
{
"id": "b298ee91704b489b8119c1d604a8308d",
"source": "blah",
"action": "buzz"
}
],
"occurred_at": "date"
},
{
"id": "5b5915f4cdb39c7b",
"kind": "foo",
"source": "bar",
"action": "baz",
"matches": [
{
"id": "b298ee91704b489b8119c1d604a8308d",
"source": "blah",
"action": "buzz"
}
],
"occurred_at": "date"
}
不用担心缩进或缺少尾随逗号,我已经弄清楚并确认工作正常。
【问题讨论】:
-
jq --argjson results "[$(<new.json)]" '.result += $results' original.json做你想做的事吗? -
另外,针对任何认为
{...},{...}是合理返回的东西提交错误报告。 -
它会,如果它是有效的 json(即
{...},{...}),它不是。所以不,它不起作用,它给了我一个错误,它应该,因为它是有道理的。它不是有效的 json。但如果它确实有效,结果将是有效的 json。我想你误解了{...},{...}是有效的 json。 -
我知道不是;这就是为什么我在我的建议中将
$(<new.json)包裹在[...]中,以将其转换为有效数组。 -
哦,对不起,我错过了。是的,这正是我想要的。非常感谢@chepner