我正在滚动jq手册并阅读所有可用的命令,但是阅读它仅完成了大约10%。(这很长,这是一件好事,除了我要在六天内提交一个艺术项目演示文稿之外,我必须首先完成此JSON分析,以便可以开始测量350米的切割磁带。)
我有一个只有一个对象的JSON文件。该对象包含3555个JSON对象的数组,可以通过其索引从0到3554对其进行访问。这显示了这些JSON对象之一的结构(我修改了电话号码以及即时消息的主体/内容消息,因为这来自真实的对话):
$ cat selected-convo.json | jq '.[3554]'
{
"timestamp": 1589547750278,
"attachments": [],
"source": "+491604444444",
"sourceUuid": "a258be99-b00a-456d-bba6-258d72878b64",
"sourceDevice": 1,
"sent_at": 1589536960941,
"sent_to": [
"+31707777777"
],
"received_at": 1589547750278,
"conversationId": "823c0416-9406-4922-8ee9-f3cf36c4784c",
"type": "outgoing",
"sent": true,
"unidentifiedDeliveries": [
"+31707777777"
],
"expirationStartTimestamp": 1589536960941,
"schemaVersion": 10,
"id": "42e9ed93-ad1e-44fc-912a-dd310c16b52e",
"body": "X xxxx X xxxx X xxx xxxxxxxxx xx xxx.",
"contact": [],
"decrypted_at": 1589547750368,
"errors": [],
"flags": 0,
"hasAttachments": 0,
"isViewOnce": false,
"preview": [],
"requiredProtocolVersion": 0,
"supportedVersionAtReceive": 4,
"quote": null,
"sticker": null,
"recipients": [
"+31707777777"
]
}
我只想衡量一个人回复另一个人所花费的时间。因此,我想要的键值对是在时间戳发送的,无论消息是传入还是传出。
$ cat selected-convo.json | jq '.[] | .sent_at, .type'
给我以下输出(3555数组中的前十个):
1577640636917
"outgoing"
1577674806478
"incoming"
1577674810527
"incoming"
1578513043504
"outgoing"
1578520666264
"outgoing"
1580600735958
"outgoing"
1580600816040
"outgoing"
1580601327790
"incoming"
1580602829082
"outgoing"
1580602833184
"outgoing"
但是,我只想看到第一个外发消息,然后是第一个外来消息,然后是下一个外发消息,再是下一个外来消息,依此类推。(如果我连续发送了三个消息,我想删除/忽略第二个消息和第三条消息,而只看第一条消息。如果在响应之前我连续收到八条消息,我只想看这些消息中的第一条消息,并删除/跳过/转发接下来的七条消息。因此,从上面的列表中,我想要:
1577640636917
"outgoing"
1577674806478
"incoming"
1578513043504
"outgoing"
1580601327790
"incoming"
1580602829082
"outgoing"
有任何想法吗?
我会foreach
为此使用它,因为该任务基本上需要一个状态机,只要状态改变,状态机就会从当前输入中提取一些值。
foreach .[] as {$type, $sent_at} (
{};
{prev: .curr, curr: $type};
if .curr != .prev
then $type, $sent_at
else empty end
)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句