好的,我应该为此感到羞耻,但我无法理解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
答案 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对象最终都在输出中的一行上。