如何在Linux上分析文件

我有以下格式的文件:

{"report":[{"call_time":"2018-03-31 00:10:13","number":"01232802624","CLI":"7941232455","name":null,"destination": null,"status":"Answered","duration":"27:30"}, {"call_time":"2018-03-31 00:12:21","number":"01233802632","CLI" :"7831233003","name":null,"destination":null,"status":"Answered","duration":"7:48"}, {"call_time":"2018-03-31 00:51 :16","number":"0123802642","CLI":"7711123367","name":null,"destination":null,"status":"Answered","duration":"0:57"} , {"通话时间":"2018-03-31 01:50:33","number":"012342802624","CLI":"7812386544","name":null,"destination":null,"status":"Answered","duration ":"9:54"}, {"call_time":"2018-03-31 16:29:38","number":"01232802642","CLI":"7741230002","name":null," destination":null,"status":"Answered","duration":"0:13"}],"summary":{"Total_Calls":"3,862","Answered_Calls":"3,834","Answered": "3,922:58","Calls_Answered":"99.1%","ACD":"8:00"},"result":1}7812386544","name":null,"destination":null,"status":"Answered","duration":"9:54"}, {"call_time":"2018-03-31 16:29:38 ","number":"01232802642","CLI":"7741230002","name":null,"destination":null,"status":"Answered","duration":"0:13"}], "summary":{"Total_Calls":"3,862","Answered_Calls":"3,834","Answered":"3,922:58","Calls_Answered":"99.1%","ACD":"8:00"} ,"结果":1}7812386544","name":null,"destination":null,"status":"Answered","duration":"9:54"}, {"call_time":"2018-03-31 16:29:38 ","number":"01232802642","CLI":"7741230002","name":null,"destination":null,"status":"Answered","duration":"0:13"}], "summary":{"Total_Calls":"3,862","Answered_Calls":"3,834","Answered":"3,922:58","Calls_Answered":"99.1%","ACD":"8:00"} ,"结果":1}"number":"01232802642","CLI":"7741230002","name":null,"destination":null,"status":"Answered","duration":"0:13"}], "summary ":{"Total_Calls":"3,862","Answered_Calls":"3,834","Answered":"3,922:58","Calls_Answered":"99.1%","ACD":"8:00"},"结果":1}"number":"01232802642","CLI":"7741230002","name":null,"destination":null,"status":"Answered","duration":"0:13"}], "summary ":{"Total_Calls":"3,862","Answered_Calls":"3,834","Answered":"3,922:58","Calls_Answered":"99.1%","ACD":"8:00"},"结果":1}1%","ACD":"8:00"},"结果":1}1%","ACD":"8:00"},"结果":1}

我需要为每个“数字”(最好是最新的 10 个项目)过滤除最新的十行之外的所有内容,并打印平均持续时间。

预期输出类似于:

2018-03-31 00:10:13 01232802624 27:30
01232802624 Average 27:30

2018-03-31 00:12:21 01233802632 7:48
01233802632 Average 7:48

2018-03-31 00:51:16 0123802642 0:57
2018-03-31 16:29:38 0123802642 0:13
0123802642 Average: 0:30

等等

欢迎提出任何想法......我已经尝试了几个小时使用 sed、grep 和 awk,但无法做到这一点......我的代码和结果到处都是。我正在努力在网上找到任何解决方案。

杰格瑞德

jq是处理 JSON 的强大工具。它在jq Manual 中有很好的文档

jq 对解析持续时间的支持有点缺乏,所以你可能不得不在那里使用其他东西,而且我不确定你想要的确切输出格式,所以我没有给出完整的解决方案。

这是一个例子,也许它可以帮助你朝着正确的方向前进:

$ jq '.report | group_by(.number) | .[][-10:] | [.] | map({number: .[0].number, calls: map({call_time: .call_time, duration: .duration})}) | .[]' < data
{
  "number": "01232802624",
  "calls": [
    {
      "call_time": "2018-03-31 00:10:13",
      "duration": "27:30"
    }
  ]
}
{
  "number": "01232802642",
  "calls": [
    {
      "call_time": "2018-03-31 16:29:38",
      "duration": "0:13"
    }
  ]
}
{
  "number": "01233802632",
  "calls": [
    {
      "call_time": "2018-03-31 00:12:21",
      "duration": "7:48"
    }
  ]
}
{
  "number": "012342802624",
  "calls": [
    {
      "call_time": "2018-03-31 01:50:33",
      "duration": "9:54"
    }
  ]
}
{
  "number": "0123802642",
  "calls": [
    {
      "call_time": "2018-03-31 00:51:16",
      "duration": "0:57"
    }
  ]
}

解释:

  1. .report: 取report根对象key
  2. group_by(.number):number按键值分组
  3. .[][-10:]:对于每组 ( .[]),仅保留最后 10 项 ( [-10:])
  4. [.]: 嵌套在一个数组中以使下一个命令愉快
  5. map(...): 将组数组映射到对象数组
  6. .[] 删除不必要的嵌套

这是另一种变体,以制表符分隔输出:

$ jq -r '.report | group_by(.number) | .[][-10:] | map([.number, .call_time, .duration]) | .[], [] | join("\t")' < data
01232802624 2018-03-31 00:10:13 27:30

01232802642 2018-03-31 16:29:38 0:13

01233802632 2018-03-31 00:12:21 7:48

012342802624    2018-03-31 01:50:33 9:54

0123802642  2018-03-31 00:51:16 0:57

解释:

  1. .report: 取report根对象key
  2. group_by(.number):number按键值分组
  3. .[][-10:]:对于每组 ( .[]),仅保留最后 10 项 ( [-10:])
  4. map(...): 将对象映射到数组项
  5. .[], []: 添加一个额外的数组以在组之间创建空间
  6. join("\t"): 用制表符连接每个数组的元素

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章