How can I do jq nested for-loops from bash?

∥☆過路亽.° 提交于 2019-12-12 03:15:40

问题


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",
}

    ]
}

回答1:


You should respect the bash syntax in your fors:

for (( i=0; i<5; i++ ))

((i=1,i< =52,j++)) won't work, use ; instead of ,.




回答2:


1) You wrote that your i-loop used ((i=1;i< =52;j++)); that should be ((i-1; i<=52; i++))

2) We can't see exactly what you did with respect to r1 and r$i, so if (1) doesn't resolve your difficulty, maybe you should double-check that what you did is actually what is needed. Should you change "> $outputname" to ">> $outputname"?

3) I suspect that rather than using s/"//g, it might be better to use the -r option of jq; you might also consider avoiding sed altogether (jq 1.5 has sub and gsub functions).

4) As I said, it would be better to get rid of all the backticks.




回答3:


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


来源:https://stackoverflow.com/questions/34509937/how-can-i-do-jq-nested-for-loops-from-bash

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!