Как выбрать значение из CSV, содержащего JSON в виде столбца
У меня есть странный CSV-файл, в котором один столбец представляет собой данные JSON довольно большого размера, а другой — имя. Для ясности показано правильное форматирование JSON, но сам файл плоский, без символов новой строки.
name,
{
"field1":
{"name":"foo",
"email":"test@gmail.com"},
"field2":{
"subfield":{
"subfield2":{
"active":1,
"passive":11,
"running":111
}
}
}
}
Ввод без красивого форматирования…
name,{"field1":{"name":"foo","email":"test@gmail.com"},"field2":{"subfield":{"subfield2":{"active":1,"passive":11,"running":111}}}}
Я пытаюсь получить имя и все уникальные значения для подполя 2 в выходные данные (в идеале CSV).
name,
active passive running
Проблема в том, что количество полей не является постоянным, как и имена подполей. Я пробовал использовать jq, Miller и sed/awk, но безуспешно, поскольку они сочетают в себе огромный объект JSON и данные CSV.
3 ответа
Если вы запустите образец ввода
<input.txt sed '/name,/d' | jq -cr '.field2.subfield.subfield2 | keys[]' | paste -s -d ' ' | mlr --csv --implicit-csv-header then label name
Вы получаете
name
active passive running
Пример вывода, который вы пишете, неверен, потому что, если это CSV с одним полем, у вас нет,
после имени других полей нет
name,
active passive running
Но я наверное не понял, чего ты хочешь
Вы можете использовать свой любимый переводчик CSV-TSV, чтобы преобразовать CSV в TSV, а затем запустить его через jq следующим образом:
jq -rR '
split("\t")
| [[.0],
( .[1]|fromjson|.field2.subfield.subfield2 | keys_unsorted|join(" "))]
| @csv'
Я провел некоторое время с sed и получил то, что мне нужно, используя следующее:
sed -e 's/.*subfield2\(.*\)}}}.*/\1/' input.txt