jq:在格式文件中使用type

时间:2017-11-19 22:32:45

标签: bash jq

我有多个不同格式的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语句格式化文件的语法吗?

2 个答案:

答案 0 :(得分:0)

您的jq脚本正常有效(提供{"numbers": "2"}的输出),如果编写如下:

{
   numbers: (.numbers | if type=="array" then .[2] else . end)
}

答案 1 :(得分:0)

  

如果它是一个数组,我想得到数组中的第二个元素,如果不是,只需返回可用的元素。

  1. 如果通过“第二个元素”表示第二个元素,则使用1作为数组索引,因为jq的“索引原点”为0。

  2. 您的两个示例(Format_1和Format_2)都将数组作为.numbers的值,但如果您的要求如上所述,并将“2nd”解释为“second”,则为jq过滤器似乎是:

    .numbers |如果输入==“array”那么。[1]否则。端

  3. 你的程序很短,你可以按如下方式运行它:

    jq -c '.numbers | if type == "array" then .[1] else . end' Format_{1,2}
    
    1. 如果要将jq程序放在文件中,那么最好使用“jq”文件类型(即命名文件,使其以“.jq”结尾)。使用Format_file.jq作为文件名,可以使用以下调用:

      jq -f Format_file.jq -c Format_1 Format_2

    2. 请注意避免使用cat

      1. 在所有示例中,没有必要或明智地使用具有多个jq调用的管道。
      2. 如果您希望输出看起来像输入,但要按照上面的说法改变“数字”键的值,您可以简单地替换'= by | =`:

         .numbers |= if type == "array" then .[1] else . end