2015-12-23 29 views
4

我想将json文件拆分为各种json文件。输入(r1.json)看起来像:如何使用jq在bash中创建for循环

{ 

    "results" : [ 

       { 
      content 1 
} 
, 
{ 
      content 2 
} 
, 
{ 
      content n 
} 

    ] 
} 

我想输出为n个文件:1.json,2.json,n.json。分别包含{content 1},{content 2}和{content n}。

我想:

for i in {0..24}; do cat r1.json | jq '.results[$i]' >> $i.json; done 

但我有以下错误:错误:我没有定义

+2

给[shellcheck(http://www.shellcheck.net)一去!在这种情况下,它表示“表达式不会用单引号扩展,用双引号表示。 –

+0

好的链接,thx很多,它允许我在{0..24}中修改我的命令'code'。做jq <“r1.json”“.results [$ i]”> .json; done'code' – crocefisso

回答

2

虽然上面的答案是正确的,请注意,JQ脚本插值shell变量是所有一个可怕的想法,但最琐碎的脚本。在任何所提供的解决方案,替换以下:

jq ".results[$i]" 

下列要求:

jq --arg i "$i" '.results[$i | tonumber]' 
+0

非常感谢你的提示@Santiago Lapresta。事实上,我上面提到的简单线路运行良好,但没有使用jq --arg,但对于更详细的问题,会出现问题。你使用jq --arg作为嵌套循环,例如我的脚本应该做一些像[that](https://www.dropbox.com/s/83ouwgo62eoyov1/SOF.sh?dl=0) – crocefisso

+1

我不'你真的明白这个脚本是干什么的吗?你能提供一个更简单的例子吗?你最好不要在jq之外使用循环时间;只需在jq进程中使用'range'就可以了。 关于'--arg',如果你需要传入几个变量,你可以做多个'--arg'调用。 另外,考虑到你链接的脚本;你应该在jq上使用'-r'而不是用'sed'去掉引号。 –

+0

终于我发现[解决方案](http://stackoverflow.com/questions/34509937/how-can-i-do-jq-nested-for-loops-from-bash)到嵌套循环问题。你会知道一些很好的文档来理解jq是如何工作的吗? – crocefisso

2

尝试

for i in {0..24}; do cat r1.json | jq ".results[$i]" >> $i.json; done 

注意shell变量不能内扩大单引号。

IHTH

+0

非常感谢! – crocefisso

+1

请点击外部左上角的绿色箭头接受解答您的问题的答案的答案;-)。很高兴帮助。 – shellter

2

单引号可能是你搞砸了。 Bash变量不会用单引号扩展。您正在传递一个文字字符串.results[$i]jq。尝试双引号来代替:

for i in {0..24}; do 
    cat r1.json | jq ".results[$i]" >> $i.json 
done