Я пытался преобразовать некоторые JSON в CSV, и у меня есть следующая проблема:
У меня есть следующий ввод json:
{"id": 100, "a": [{"t" : 1,"c" : 2 }, {"t": 2, "c" : 3 }] }
{"id": 200, "a": [{"t": 2, "c" : 3 }] }
{"id": 300, "a": [{"t": 1, "c" : 3 }] }
И я ожидаю следующий вывод CSV:
id,t1,t2
100,2,3
200,,3
300,3,
К сожалению, JQ не выводится, если один из селекторов не соответствует. Пример:
echo '{ "id": 100, "a": [{"t" : 1,"c" : 2 }, {"t": 2, "c" : 3 }] }' | jq '{t1: (.a[] | select(.t==1)).c , t2: (.a[] | select(.t==2)).c }'
output:
{ "t1": 2, "t2": 3 }
, но если один из выбранных объектов не возвращает соответствия, он не возвращается вообще. Пример:
echo '{ "id": 100, "a": [{"t" : 1,"c" : 2 }] }' | jq '{t1: (.a[] | select(.t==1)).c , t2: (.a[] | select(.t==2)).c }'
Ожидаемый результат:
{ "t1": 2, "t2": null }
Кто-нибудь знает, как этого добиться с помощью JQ?
РЕДАКТИРОВАТЬ:
На основе комментарий, сделанный @peak Я нашел решение, которое искал.
jq -r '["id","t1","t2"],[.id, (.a[] | select(.t==1)).c//null, (.a[] | select(.t==2)).c//null ]|@csv'
Альтернативный оператор делает именно то, что я искал. Альтернативный оператор