用jq过滤空值和/或空值

时间:2019-06-20 18:37:38

标签: json null jq key-value jsonlines

我有一个带有jsonlines的文件,想查找空值。

{"name": "Color TV", "price": "1200", "available": ""}
{"name": "DVD player", "price": "200", "color": null}

并希望输出空值和/或空值及其键:

available: ""
color: null

我认为应该是cat myexample | jq '. | selec(. == "")'之类的东西,但是不起作用。

3 个答案:

答案 0 :(得分:0)

以下代码段使用Object.keys()从对象键中创建一个数组。 然后,它遍历该数组并测试每个键的null ||。空字符串。 它创建一个keyName:值的obj并将其推入emptyKeys arr,然后在完成后将其记录到控制台。

const obj0 = {"name": "Color TV", "price": "1200", available: ""},
      obj1 = {"name": "DVD player", "price": "200", color: null};

function extractNullKeys(obj) {
  const emptyKeys = [];
  Object.keys(obj).forEach(function (k) {
    (obj[k] == null || obj[k] == "") && emptyKeys.push({ [k] : obj[k]});
  });
  console.log(emptyKeys);
}
extractNullKeys(obj0);
extractNullKeys(obj1);

答案 1 :(得分:0)

这里最棘手的部分是发出带有引号的空字符串,而引号没有引号。这是与jq的-r命令行选项一起使用的一种解决方案:

to_entries[]
| select(.value | . == null or . == "")
| if .value == "" then .value |= "\"\(.)\"" else . end
| "\(.key): \(.value)"

一旦以明显的方式修改了给定的输入以使其有效为JSON,则输出将完全按照指定的方式进行。

答案 2 :(得分:0)

有些人可能会发现以下 jq 程序对于识别具有 null 或空字符串值的键更有用:

with_entries(select(.value |.==null or . == ""))

使用示例输入,该程序将产生:

{"available":""}
{"color":null}

添加更多信息(例如输入行或对象编号)也很有意义,例如也许:

with_entries(select(.value |.==null or . == ""))
| select(length>0)
| {n: input_line_number} + .