输入 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 - -