Json 比较数组中前一个元素与其后一个元素之间的值

Json 比较数组中前一个元素与其后一个元素之间的值,json,bash,shell,jq,Json,Bash,Shell,Jq,我正在滚动并阅读所有可用的命令,但阅读完成率只有10%。(这很长,这是一件好事,除了我有一个艺术项目演示文稿要在六天内完成,我必须先完成JSON分析,这样我才能开始测量一段350米长的带子。) 我有一个JSON文件,其中正好有一个对象。这一个对象包含一个3555个JSON对象的数组,可以通过其从0到3554的索引进行访问。这显示了其中一个JSON对象的结构(我已经修改了电话号码和即时消息的正文/内容,因为这来自真实的对话): 我只对衡量一个人回应另一个人所花的时间感兴趣。因此,我想要的键值对是发

我正在滚动并阅读所有可用的命令,但阅读完成率只有10%。(这很长,这是一件好事,除了我有一个艺术项目演示文稿要在六天内完成,我必须先完成JSON分析,这样我才能开始测量一段350米长的带子。)

我有一个JSON文件,其中正好有一个对象。这一个对象包含一个3555个JSON对象的数组,可以通过其从0到3554的索引进行访问。这显示了其中一个JSON对象的结构(我已经修改了电话号码和即时消息的正文/内容,因为这来自真实的对话):

我只对衡量一个人回应另一个人所花的时间感兴趣。因此,我想要的键值对是发送时间戳,以及消息是传入还是传出

 $ cat selected-convo.json | jq '.[] | .sent_at, .type'
给我以下输出(3555数组中的前十个):

但是,我只想看到第一条传出消息,然后是第一条传入消息,然后是下一条传出消息,然后是下一条传入消息,等等。(如果我连续发送了三条消息,我希望删除/忽略第二条和第三条消息,只查看第一条消息。如果我在响应之前收到了连续八条消息,我只希望看到第一条消息,并删除/跳过/转发以下七条消息。因此,从上面的列表中,我希望:

1577640636917
"outgoing"

1577674806478
"incoming"

1578513043504
"outgoing"

1580601327790
"incoming"

1580602829082
"outgoing"
有什么想法吗?

我会用它,因为任务基本上需要一个状态机,每当状态改变时,它就会从当前输入中提取一些值

foreach .[] as {$type, $sent_at} (
  {};
  {prev: .curr, curr: $type};
  if .curr != .prev
  then $type, $sent_at
  else empty end
)

这非常有效!我保存了我的查询结果和您的查询结果,然后运行了一个快速检查/测试和哇!感谢您提供jq手册的链接,以便我可以学习/理解其工作原理。:)
1577640636917
"outgoing"

1577674806478
"incoming"

1578513043504
"outgoing"

1580601327790
"incoming"

1580602829082
"outgoing"
foreach .[] as {$type, $sent_at} (
  {};
  {prev: .curr, curr: $type};
  if .curr != .prev
  then $type, $sent_at
  else empty end
)