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 필터를 사용하면 "-"로 대체할 수 있는 "null" 값이 없는 출력을 얻습니다.
$ jq -r '.|[.login, .lastLoginTime, .lastLoginFrom]|@tsv' test_json
050111 1529730115000 192.168.66.230
050112
그러한 null 값에 대해 "-"를 인쇄하는 다른 방법이 있습니까?
답변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 - -