jq - 打印“-”表示空值

jq - 打印“-”表示空值

输入 json:

{
  "id": "3885",
  "login": "050111",
  "lastLoginTime": 1529730115000,
  "lastLoginFrom": "192.168.66.230"
}
{
  "id": "3898",
  "login": "050112",
  "lastLoginTime": null,
  "lastLoginFrom": null
}

我想以制表符分隔格式获取登录、lastLoginTime 和 lastLoginFrom 的输出:

050111  1529730115000   192.168.66.230
050112              -                -

使用下面的 jq 过滤器,我得到的输出没有“空”值,我可以用“-”替换

$ jq -r '.|[.login, .lastLoginTime, .lastLoginFrom]|@tsv' test_json
050111  1529730115000   192.168.66.230
050112

有没有其他方法可以为此类空值打印“-”?

答案1

使用替代运算符//

所以 :

$jq -r '.|[.login, .lastLoginTime // "-" , .lastLoginFrom // "-" ]|@tsv' test_json
050111  1529730115000   192.168.66.230
050112  -   -

答案2

这使用与 EchoMike444相同的实际功能jq将值更改为破折号null他们的答案,但是用另一种方式来做。

我没有列出要提取的密钥,而是删除了id我们不想使用的密钥。然后,我提取剩余的值并用于将破折号中map()的值更改为:null

$ jq -r '[del(.id)[]] | map(.//"-") | @tsv' file
050111  1529730115000   192.168.66.230
050112  -       -

使用磨坊主( mlr) 读取 JSON 输入并将所有为 null 的字段更改为-.然后我们排除该id字段并将剩下的内容输出为 TSV。

$ mlr --ijson --otsv --headerless-csv-output put 'for (k,v in $*) { is_null(v) { $[k] = "-" } }' then  cut -x -f id file
050111  1529730115000   192.168.66.230
050112  -       -

相关内容