Я сделал несколько попыток и поиска на net. Найденный код, который помогает ( jq: Object не может быть отформатирован в csv, только массив ).
Создан файл json2csv.jq, содержащий:
def json2headers:
def isscalar: type | . != "array" and . != "object";
def isflat: all(.[]; isscalar);
paths as $p
| getpath($p)
| if type == "array" and isflat then $p
elif isscalar and (($p[-1]|type) == "string") then $p
else empty end ;
def json2array($header):
def value($p):
try getpath($p) catch null
| if type == "object" then null else . end;
[$header[] as $p | value($p)];
def json2csv:
( [.[] | json2headers] | unique) as $h
| ([$h[]|join("_") ],
(.[]
| json2array($h)
| map( if type == "array" then map(tostring)|join("|") else tostring end)))
| @csv ;
Вызовите его с помощью:
jq -r -L. 'include "json2csv"; json2csv' connAAA.json
Я получил:
"bytesReceived","bytesSent","duration","endTime","remoteIpAddress","startTime","virtualIpAddress"
"9510","4657","81","1585511362","192.168.101.91","1585511281","10.20.1.6"
"48586","52696","1956","1585514599","192.168.101.91","1585512643","10.20.1.6"
"11829","7399","153","1585514835","192.168.101.91","1585514682","10.20.1.6"
"13871","10318","330","1585518156","192.168.101.91","1585517826","10.20.1.6"
Если я использую @tsv вместо @csv Я получил:
bytesReceived bytesSent duration endTime remoteIpAddress startTime virtualIpAddress
9510 4657 81 1585511362 192.168.101.91 1585511281 10.20.1.6
48586 52696 1956 1585514599 192.168.101.91 1585512643 10.20.1.6
11829 7399 153 1585514835 192.168.101.91 1585514682 10.20.1.6
13871 10318 330 1585518156 192.168.101.91 1585517826 10.20.1.6
Это близко к моему желаемому результату. Теперь (возможно, раньше) мне нужно преобразовать Unix метку времени в DateTime.
Я полагаю, что использую функцию todateiso8601, но не могу вставить ее правильно.
Предположим, это не сложно опытный парень; -)
Спасибо, П.