我有多个不同格式的json文件。
**Format_1**:
{
"numbers":[
"0",
"1",
"2"
]
}
**Format_2**:
{
"numbers":[
"0"
]
}
如果它是一个数组,我想得到数组中的第二个元素,如果不是,只需返回可用的元素。
cat Format_1 | jq '.numbers' | jq 'if type=="array" then '.[2]' else '.' end'
上面的命令工作正常,并给我输出 1
cat Format_2 | jq '.numbers' | jq 'if type=="array" then '.[2]' else '.' end'
上面的命令给我输出0 。
当我尝试将上述内容放入格式文件并将其传递给jq时,我会收到语法错误
**Format_File**:
{
numbers : .numbers | 'if type=="array" then '.[2]' else '.' end'
}
命令:
cat Format_1 | jq -f Format_file -c
jq:错误:语法错误,意外结束(Unix shell引用问题?),第11行: 数字:.numbers | '如果输入=="数组"然后'。[2]'别的'。'端',
有人可以帮助我使用IF语句格式化文件的语法吗?
答案 0 :(得分:0)
您的jq
脚本正常有效(提供{"numbers": "2"}
的输出),如果编写如下:
{
numbers: (.numbers | if type=="array" then .[2] else . end)
}
答案 1 :(得分:0)
如果它是一个数组,我想得到数组中的第二个元素,如果不是,只需返回可用的元素。
如果通过“第二个元素”表示第二个元素,则使用1作为数组索引,因为jq的“索引原点”为0。
您的两个示例(Format_1和Format_2)都将数组作为.numbers
的值,但如果您的要求如上所述,并将“2nd”解释为“second”,则为jq过滤器似乎是:
.numbers |如果输入==“array”那么。[1]否则。端
你的程序很短,你可以按如下方式运行它:
jq -c '.numbers | if type == "array" then .[1] else . end' Format_{1,2}
如果要将jq程序放在文件中,那么最好使用“jq”文件类型(即命名文件,使其以“.jq”结尾)。使用Format_file.jq
作为文件名,可以使用以下调用:
jq -f Format_file.jq -c Format_1 Format_2
请注意避免使用cat
。
如果您希望输出看起来像输入,但要按照上面的说法改变“数字”键的值,您可以简单地替换'= by
| =`:
.numbers |= if type == "array" then .[1] else . end