【发布时间】:2017-10-05 21:46:16
【问题描述】:
我收到以下输入文件:
- input.json:
[
{"ID":"aaa_12301248","time_CET":"00:00:00","VALUE":10,"FLAG":"0"},
{"ID":"aaa_12301248","time_CET":"00:15:00","VALUE":18,"FLAG":"0"},
{"ID":"aaa_12301248","time_CET":"00:30:00","VALUE":160,"FLAG":"0"},
{"ID":"bbb_0021122","time_CET":"00:00:00","VALUE":null,"FLAG":"?"},
{"ID":"bbb_0021122","time_CET":"00:15:00","VALUE":null,"FLAG":"?"},
{"ID":"bbb_0021122","time_CET":"00:30:00","VALUE":22,"FLAG":"0"},
{"ID":"ccc_0021122","time_CET":"00:00:00","VALUE":null,"FLAG":"?"},
{"ID":"ccc_0021122","time_CET":"00:15:00","VALUE":null,"FLAG":"?"},
{"ID":"ccc_0021122","time_CET":"00:30:00","VALUE":20,"FLAG":"0"},
{"ID":"ddd_122455","time_CET":"00:00:00","VALUE":null,"FLAG":"?"},
{"ID":"ddd_122455","time_CET":"00:15:00","VALUE":null,"FLAG":"?"},
{"ID":"ddd_122455","time_CET":"00:30:00","VALUE":null,"FLAG":"?"},
]
如您所见,有一些有效值(FLAG:0)和一些无效值(FLAG:“?”)。 现在我得到了一个看起来像这样的文件(每个 ID 一个):
aaa.json:
[
{"ID":"aaa_12301248","time_CET":"00:00:00","VALUE":10,"FLAG":"0"},
{"ID":"aaa_12301248","time_CET":"00:15:00","VALUE":null,"FLAG":"?"},
{"ID":"aaa_12301248","time_CET":"00:55:00","VALUE":45,"FLAG":"0"}
]
如您所见,对象一与 input.json 中的对象相同,但对象二无效(FLAG:“?”)。这就是为什么必须用 input.json 中的正确对象(使用 VALUE:18)替换对象 2 的原因。 对象可以通过“time_CET”和“ID”元素来识别。
此外,input.json 中还会有新的对象,这些对象不是 aaa.json 等的一部分。这些对象应该添加到数组中,并且应该保留 aaa.json 中的有效对象。
最后,aaa.json 应该是这样的:
[
{"ID":"aaa_12301248","time_CET":"00:00:00","VALUE":10,"FLAG":"0"},
{"ID":"aaa_12301248","time_CET":"00:15:00","VALUE":18,"FLAG":"0"},
{"ID":"aaa_12301248","time_CET":"00:30:00","VALUE":160,"FLAG":"0"},
{"ID":"aaa_12301248","time_CET":"00:55:00","VALUE":45,"FLAG":"0"}
]
所以,总结一下:
- 寻找标志:“?”在 aaa.json 中
- 使用“ID”将这个对象替换为来自 input.json 的匹配对象 和“time_CET”用于映射。
- 保持现有的有效对象并从 input.json 添加对象 之前在 aaa.json 中不存在(这意味着只有对象开始 在“ID”字段中带有“aaa”)
- 对 bbb.json、ccc.json 和 ddd.json 重复此操作
我不确定是否可以使用这样的命令一次完成所有操作,因为输出必须返回到正确的 id 文件(aaa、bbb ccc.json):
jq --argfile aaa aaa.json --argfile bbb bbb.json .... -f prog.jq input.json
问题是,标识符后面的数字(aaa、bbb、ccc 等)可能会改变。因此,要确保将对象添加到正确的文件/数组中,需要这样的语句:if (."ID"|contains("aaa")) then ....
还是用不同的输入参数多次运行程序更好?我不确定..
提前谢谢你!!
【问题讨论】: