簡體   English   中英

使用 jq 過濾空值和/或 null 值

[英]Filter empty and/or null values with jq

我有一個包含 jsonlines 的文件,想查找空值。

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

並希望 output 為空和/或 null 值及其鍵:

available: ""
color: null

我認為它應該類似於cat myexample | jq '. | select(. == "")' cat myexample | jq '. | select(. == "")' cat myexample | jq '. | select(. == "")' ,但不起作用。

這里棘手的部分是以空字符串顯示帶引號的方式發出不帶引號的鍵。 這是一種適用於 jq 的 -r 命令行選項的解決方案:

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

一旦以明顯的方式修改了給定的輸入以使其成為有效的 JSON,輸出就完全符合指定的要求。

使用單個with_entries(if.value == null or.value == " then empty else. end)過濾器表達式可以過濾掉null和空 ( "" ) 值。

不過濾:

echo '{"foo": null, "bar": ""}' | jq '.'
{
  "foo": null,
  "bar": ""
}

帶過濾:

s3 echo '{"foo": null, "bar": ""}' |  jq 'with_entries(if .value == null or .value == "" then empty else . end)'
{}

下面的代碼片段使用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); 

有些人可能會發現以下 jq 程序對於識別具有 null 或空字符串值的鍵更有用:

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

使用樣本輸入,該程序將產生:

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

添加更多信息,例如輸入行或對象編號,也很有意義,例如:

with_entries(select(.value |.==null or . == ""))
| select(length>0)
| {n: input_line_number} + .
jq . | grep -E '(null|0|""|\[\]|\{\}),?$'

看看這個片段https://blog.nem.ec/code-snippets/jq-ignore-nulls/

jq -r '.firstName | select( . != null )' file.json

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM