jq - null 값에 대해 "-" 인쇄

jq - null 값에 대해 "-" 인쇄

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

관련 정보