我怎么能JQ嵌套的for循环从bash的? [英] How can I do jq nested for-loops from bash?

查看:2298
本文介绍了我怎么能JQ嵌套的for循环从bash的?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个包含各25结果(0〜24)52 JSON文件(R $ i.json)。我想创建一个JSON文件为每个这些结果的一个特别的名字。名称将根据每个这些结果的内容组成:YYYYMMDDHHMMSS_company_jobtitle.json

命令生成的名字很好地工作:

 #!斌/庆典
为((J = 0; J< = 24; J ++))

   datein = $(JQ<r1.json。结果[$ J] .date| sed的'S /// G')
   dateout = $(日期-d$ {} datein+%Y%M%D%H%M%S)
   公司= $(JQ<r1.json。结果[$ J]。公司| sed的'S /,//克; S ///克; S / // G')
   工作= $(JQ<r1.json。结果[$ J] .jobtitle| sed的'S /,//克; S ///克; S / // G')
   JQ<r1.json。结果[$ j]的> $ {dateout} _ $ {}公司_ $ {}工作以.json
DONE

现在,当我更换R1由R $ i和增加((i = 1; I< = 52; J ++)),这是行不通的。所以我想我的问题来自于JQ嵌套循环语法..

r1.json会是什么样子的:

  {    半径:25,
    使用totalResults:1329,    结果:                {
                    JOBTITLE:JOB1,
                    公司:公司1,
                    日期:孙,2015年9月1日7时59分58秒格林尼治标准​​时间,
}

                {
                    JOBTITLE:JOB2,
                    公司:Company2的
                    日期:孙,2015年9月2日7时59分58秒格林尼治标准​​时间,
}

            | ...]
                {
                    JOBTITLE:job25,
                    公司:company25,
                    日期:孙,2015年9月25日7时59分58秒格林尼治标准​​时间,
}    ]
}


解决方案

我终于找到了解决办法,我的问题不是来自JQ但是从语法,我使用嵌套循环...这是

 为((i = 1; I< = KDR;我+ +))

   为((J = 0; J< = 24; J ++))
   做
    datein = $(JQ<R $ i.json。结果[$ J] .date| sed的'S /// G')
    dateout = $(日期-d$ {} datein+%Y%M%D%H%M%S)
    公司= $(JQ<R $ i.json。结果[$ J]。公司| sed的'S /,//克; S ///克; S / // G')
    工作= $(JQ<R $ i.json。结果[$ J] .jobtitle| sed的'S /,//克; S ///克; S / // G')
    JQ<R $ i.json。结果[$ j]的> $ {dateout} _ $ {}公司_ $ {}工作以.json
   DONE
DONE

I have 52 json files (r$i.json) containing each 25 results (0 to 24). I'd like to create a json file with a special name for each of these results. The name would be composed according to the content of each of these results : YYYYMMDDHHMMSS_company_jobtitle.json

the command generating names work fine :

#!bin/bash
for ((j=0;j<=24;j++))
do
   datein=$(jq <"r1.json" ".results[$j].date" | sed 's/"//g')
   dateout=$(date -d "${datein}" +"%Y%m%d%H%M%S")
   company=$(jq <"r1.json" ".results[$j].company" | sed 's/,//g;s/"//g;s/ //g')
   job=$(jq <"r1.json" ".results[$j].jobtitle" | sed 's/,//g;s/"//g;s/ //g')
   jq <"r1.json" ".results[$j]" > ${dateout}_${company}_${job}.json
done

Now when I replace r1 by r$i and add ((i=1;i<=52;j++)) it doesn't work... So I guess my problem comes from nested loop syntax in jq...

r1.json would look like that :

 {

    "radius" : 25,
    "totalResults" : 1329,

    "results" : [

                {
                    "jobtitle" : "job1",
                    "company" : "company1,
                    "date" : "Sun, 01 Sep 2015 07:59:58 GMT",
}
,
                {
                    "jobtitle" : "job2",
                    "company" : "company2",
                    "date" : "Sun, 02 Sep 2015 07:59:58 GMT",
}
,
            |...]
                {
                    "jobtitle" : "job25",
                    "company" : "company25,
                    "date" : "Sun, 25 Sep 2015 07:59:58 GMT",
}

    ]
}

解决方案

Finally I found the solution, and my issue didn't come from jq but from the syntax I was using for nested loops... Here it is :

for ((i=1;i<=kdr;i++))
do
   for ((j=0;j<=24;j++))
   do
    datein=$(jq <"r$i.json" ".results[$j].date" | sed 's/"//g')
    dateout=$(date -d "${datein}" +"%Y%m%d%H%M%S")
    company=$(jq <"r$i.json" ".results[$j].company" | sed 's/,//g;s/"//g;s/ //g')
    job=$(jq <"r$i.json" ".results[$j].jobtitle" | sed 's/,//g;s/"//g;s/ //g')
    jq <"r$i.json" ".results[$j]" > ${dateout}_${company}_${job}.json
   done
done

这篇关于我怎么能JQ嵌套的for循环从bash的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆