免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 16074 | 回复: 19

[文本处理] 如何通过shell取得下面JSON里的数据 [复制链接]

论坛徽章:
0
发表于 2017-04-14 08:26 |显示全部楼层

JSON文件内容如下:
[
  {
    "target": "test",
    "datapoints": [
      [
        150662802.886176,
        1491871680
      ],
      [
        148571954.715462,
        1491871740
      ],
      [
        151503913.757496,
        1491871800
      ]
    ]
  }
]



如何通过shell取得里面的值分别写到一个数组里?
就是所有后面带小数点的乘8取出来放到一个数组里,不带小数点的乘1000放到另外一个数组里

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2017-04-14 09:24 |显示全部楼层
回复 1# icefishxmg

$ a=(`awk 'BEGIN{split("8 1000",m)}/\[/{c=0}/^ *[0-9.]+/{$1*=m[++c];if(c==1)printf("%f\n",$1)}' a.json`)

$ echo ${a[@]}
1205302423.089408 1188575637.723696 1212031310.059968

$ b=(`awk 'BEGIN{split("8 1000",m)}/\[/{c=0}/^ *[0-9.]+/{$1*=m[++c];if(c==2)printf("%d\n",$1)}' a.json`)

$ echo ${b[@]}
1491871680000 1491871740000 1491871800000

论坛徽章:
0
发表于 2017-04-14 09:40 |显示全部楼层
回复 2# jason680

如果我的数组数量特别多,怎么能遍历所有的然后分别入组呢?

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2017-04-14 09:44 |显示全部楼层
回复 3# icefishxmg

栗子?

what do you want? or example ...

论坛徽章:
0
发表于 2017-04-14 09:53 |显示全部楼层
回复 4# jason680

知道怎么弄了,谢谢您了!

论坛徽章:
0
发表于 2017-04-14 10:03 |显示全部楼层
本帖最后由 icefishxmg 于 2017-04-14 10:10 编辑

回复 4# jason680

兄弟,如果我的这个JSON数据有上千行,我想去最后300组数据怎么做?我的原始数组是平行数组,我得用JQ命令给整理格式,怎么写到您这个代码里面呢?整理格式的代码是  cat test.json | jq .
还有我整理了下您的代码,因为我每个数的中间要加逗号,所以您的代码我给改成这样:
a=(`awk 'BEGIN{split("8 1000",m)}/\[/{c=0}/^ *[0-9.]+/{$1*=m[++c];if(c==1)printf("%f,\n",$1)}' a.json`)
但是有个问题,生成的数组最后一个后面也有逗号,最后一个怎么能让他没有逗号呢?

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2017-04-14 10:26 |显示全部楼层
回复 6# icefishxmg

please give the information as below:
1. input data
2. procedure/process
3. output data

论坛徽章:
0
发表于 2017-04-14 12:55 |显示全部楼层
本帖最后由 本友会机友会摄友会 于 2017-04-14 12:57 编辑

楼主要愿意用powershell的话,我可以给你写个脚本。支持win,linux处理。
linux需要这些版本:
◦Ubuntu 14.04 / 16.04
◦CentOS / RHEL 7及以上
◦open SUSE 42及以上
◦Arch Linux (archl inux 没有版本号)
◦LINUX docker 容器
◦Linux AppImage 容器(portable application single binary)  https://github.com/probonopd/AppImageKit


$开始 =====$数组.count - 300 - 1
$结束 =====$数组.count - 1

论坛徽章:
0
发表于 2017-04-14 13:50 |显示全部楼层
回复 7# jason680

数据:[{"target": "tx", "datapoints": [[109005337.0656, 1491954360], [101993738.536408, 1491954420], [102060412.252589, 1491954480], [101379713.736238, 1491954540]]}, {"target": "rx", "datapoints": [[378849290.100856, 1491959700], [383391367.51079, 1491959760], [381350186.271844, 1491959820], [374395372.257555, 1491959880]]}

最终整理成的样子是要从后往前比如最后3组数据


{
    "constr": "Chart",
    "options": {"xAxis":{"type":"datetime"},"series":[{"data":[[数组里后面的数*1000,前面的数*8],[数组里后面的数*1000,前面的数*8],"type":"line"},{"data":[数组里后面的数*1000,前面的数*8],[数组里后面的数*1000,前面的数*8],"type":"line"}]}
}


前面的data里是target为tx的,后面的data里是target为rx的

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2017-04-14 18:38 |显示全部楼层
本帖最后由 jason680 于 2017-04-14 18:49 编辑

回复 9# icefishxmg

$ cat a.json
[{"target": "tx", "datapoints": [[109005337.0656, 1491954360], [101993738.536408, 1491954420], [102060412.252589, 1491954480], [101379713.736238, 1491954540]]}, {"target": "rx", "datapoints": [[378849290.100856, 1491959700], [383391367.51079, 1491959760], [381350186.271844, 1491959820], [374395372.257555, 1491959880]]}]

$ jq '.[] | {data: .datapoints}' a.json | awk -vlast=2 'BEGIN{printf("{\n%4s\"constr\": \"Chart\",\n%4s\"options\": {\"xAxis\":{\"type\":\"datetime\"},\"series\":[",x,x)}/"data":/{++d;b=c=1;sd=$1}/^ +[0-9.,]+$/{a[d,b%last,c]=$1;++c}/^ +[0-9.]+$/{++b;c=1}END{for(nd=1;nd<=d;++nd){s=s ndc "{" sd "[";ndc=", ";nbc="";for(nb=0;nb<last;++nb){k=(nb+b)%last;s=s nbc sprintf("[%d, %f]",a[nd,k,2]*1000,a[nd,k,1]*8);nbc=", "}s=s "], \"type\":\"line\"}"}print s "]}\n}"}'
{
    "constr": "Chart",
    "options": {"xAxis":{"type":"datetime"},"series":[
{"data":[[1491954480000, 816483298.020712], [1491954540000, 811037709.889904]], "type":"line"}, {"data":[[1491959820000, 3050801490.174752], [1491959880000, 2995162978.060440]], "type":"line"}]}
}

评分

参与人数 1信誉积分 +50 收起 理由
icefishxmg + 50 很给力!

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP