如何从 bash 执行 jq 嵌套 for 循环?

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

我有 52 个 json 个文件 (r$i.json),每个文件包含 25 个结果(0 到 24)。我想为每个结果创建一个具有特殊名称的 json 文件。名称将根据每个结果的内容组成:YYYYMMDDHHMMSS_company_jobtitle.json

生成名称的命令工作正常:

#!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

现在,当我用 r$i 替换 r1 并添加 ((i=1;i<=52;j++)) 它不起作用...所以我想我的问题来自 jq 中的嵌套循环语法...

r1.json 看起来像这样:

 {

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

    ]
}

您应该尊重 for 中的 bash 语法:

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

((i=1,i< =52,j++)) 不起作用,请使用 ; 而不是 ,

1) 你写道你的 i-loop 使用了 ((i=1;i< =52;j++));应该是 ((i-1; i<=52; i++))

2) 我们无法确切地看到你对 r1 和 r$i 做了什么,所以如果 (1) 没有解决你的困难,也许你应该 double-check 你所做的是实际上需要什么。您应该将“> $outputname”更改为“>> $outputname”吗?

3) 我怀疑使用 jq 的 -r 选项而不是使用 s/"//g 可能会更好;您也可以考虑完全避免使用 sed(jq 1.5 具有 sub 和 gsub 函数)。

4) 正如我所说,最好去掉所有的反引号。

最后我找到了解决方案,我的问题不是来自 jq,而是来自我用于嵌套循环的语法...在这里:

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