使用文件B上的引用更新json文件A上的值 - 返回

时间:2015-02-24 10:27:05

标签: awk sed

好的,我应该为此感到羞耻,但我无法理解awk是如何工作的......

几天前,我发布了this question,其中有关如何使用文件B作为参考替换文件A上的字段的问题(这两个文件都有匹配的ID' s供参考)。

但是在接受了正确答案之后(感谢Ed!)我正在努力使用以下模式来做到这一点:

档案A

{"test_ref":32132112321,"test_id":12345,"test_name":"","test_comm":"test", "null_test": "true"}
{"test_ref":32133321321,"test_id":12346,"test_name":"","test_comm":"test", "test_type": "alfa"}
{"test_ref":32132331321,"test_id":12347,"test_name":"","test_comm":"test", "test_val": 1923}

档案B

{"test_id": 12345, "test_name": "Test values for null"}
{"test_id": 12346, "test_name": "alfa tests initiated"}
{"test_id": 12347, "test_name": "discard values"}

预期结果:

{"test_ref":32132112321,"test_id":12345,"test_name":"Test values for null","test_comm":"test", "null_test": "true"}
{"test_ref":32133321321,"test_id":12346,"test_name":"alfa tests initiated","test_comm":"test", "test_type": "alfa"}
{"test_ref":32132331321,"test_id":12347,"test_name":"discard values","test_comm":"test", "test_val": 1923}

我尝试了原始解决方案的一些改动,但没有成功。那么,根据之前发布的问题,我怎么能用这种新模式获得相同的结果?

PS:一个重要的注意事项,文件A上的行不一定具有相同的长度

提前致谢。

修改

在尝试了Wintermute发布的解决方案后,它确实难以使用以下行:

{"test_ref":32132112321,"test_id":12345,"test_name":"","test_comm":"test", "null_test": "true","modifiers":[{"type":3,"value":31}{"type":4,"value":33}]}

收到错误。

 error: parse error: Expected separator between values at line xxx, column xxx

1 个答案:

答案 0 :(得分:3)

使用awk或sed解析JSON不是一个好主意,原因与使用它们解析XML不是一个好主意:sed基于行工作,而JSON不是基于行的。 awk适用于模糊的表格数据,JSON不是模糊的表格。人们不希望他们的JSON工具在良性位置插入换行符时会中断。

相反,请考虑使用面向JSON处理的工具,例如jq。在这种特殊情况下,您可以使用

jq -c -s 'group_by(.test_id) | map(.[0] + .[1]) | .[]' a.json b.json > c.json

这里jq将输入文件(-s)放入JSON对象数组中,按test_id对这些对象进行分组,合并它们并解压缩数组。 -c表示紧凑的输出格式,因此结果中的每个JSON对象最终都在输出中的一行上。