jq null unix проблема с синтаксическим анализом временных меток - PullRequest
4 голосов
/ 29 мая 2020

Я пытаюсь разобрать большой файл json, который я получил с помощью curl.

Следуя этому ответу r, я мог бы проанализировать следующий файл:

$ cat test.json 
{"items": [{"id": 110, "date1": 1590590723, "date2": 1590110000, "name": "somename"}]}

с помощью следующей команды:

TZ=Europe/Kyiv jq -r '.[] | .[] | .name + "; " + (.date1|strftime("%B %d %Y %I:%M%p")) + "; " + (.date2|strftime("%B %d %Y %I:%M%p"))' test.json

Результат:

somename; May 27 2020 02:45PM; May 22 2020 01:13AM

Но когда я пытаюсь разобрать следующий файл с помощью той же команды:

$ cat test2.json 
{"items": [{"id": 110, "date1": 1590590723, "date2": null, "name": "somename"}]}

Результат:

jq: error (at test2.json:1): strftime/1 requires parsed datetime inputs

Я мог бы заменить эти нулевые значения используя sed некоторыми допустимыми значениями перед синтаксическим анализом. Но, возможно, есть лучший способ пропустить (проигнорировать) эти значения, оставив на выходе нули:

somename; May 27 2020 02:45PM; null

1 Ответ

4 голосов
/ 29 мая 2020

Вы можете настроить свою jq-программу так, чтобы она читалась так:

def tod: if type=="number" then strftime("%B %d %Y %I:%M%p") else tostring end;

.[] | .[] | .name + "; " + (.date1|tod) + "; " + (.date2|tod)

Альтернативой может быть:

def tod: (tonumber? | strftime("%B %d %Y %I:%M%p")) // null;

.[] | .[] | "\(.name); \(.date1|tod); \(.date2|tod)"
...