如何从 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
我有 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