linux - 如何使用 if else 重写 jq 中的输出

标签 linux jq

我正在尝试更改它,以便当 CrashTested 为 false 时,它输出 no,当 true 时,则输出 yes

这是 json:

{
    "Cars": [
        {   "Name": "Toyota Prius",
            "ID": 1,
            "CrashTested": "false"
},

        {   "Name": "Honda Accord",
            "ID": 2,
            "CrashTested": "true"
},
        {   "Name": "VW Beetle",
            "ID": 3,
            "CrashTested": "false"
},

        {   "Name": "Acura TL",
            "ID": 4,
            "CrashTested": "true"
},

        {   "Name": "Dodge Charger",
            "ID": 5,
            "CrashTested": "false"
},
        {   "Name": "Ford Focus",
            "ID": 6,
            "CrashTested": "true"
}
   ]
}

我尝试了以下方法:

$ jq -r '.Cars[] | .Name, .ID, map(if .CrashTested == "true" then "yes" elif .CrashTested == "false" then "no" else "unknown" end)' < cars.json
Toyota Prius
1
jq: error (at <stdin>:31): Cannot index string with string "CrashTested"

我正在尝试获得以下输出:

"Toyota Prius"
1
"no"
"Honda Accord"
2
"yes"
...

我在jq版本jq-1.5-1

我应该使用 map() 还是换一种方式?

最佳答案

如果您删除 map,那么您将获得指定值的流。不过,按照以下几行写一些东西可能更有意义:

.Cars[]
| [.Name, .ID, (if .CrashTested == "true" then "yes" elif .CrashTested == "false" then "no" else "unknown" end)]
| @csv 

或:

def yn:
  if . == true or . == "true" then "yes"
  elif . == false or . == "false" then "no"
  else "unknown"
  end;

.Cars[]
| [.Name, .ID, (.CrashTested | yn) ]

关于linux - 如何使用 if else 重写 jq 中的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57564439/

相关文章:

Linux IA-32 内存模型

linux - 如何查看我的网卡的供应商信息?

json - jq 删除重复的对象之一

json - jq from_entries 函数适用于 'key' 但不适用于 'name'

正则表达式 : How do I replace a number with zero?

windows - 通用调用约定如何处理 AVX 寄存器?

linux - Gitolite访问修复

json - jq 将过滤器的结果包含在新过滤器中

bash - jq 直接替换文件上的文本(如 sed -i)

jq - 如何使用 jq cmd 忽略某些值并打印其余值