2015-12-17 4 views
1

Я искал довольно специфическую функцию, которая может отсутствовать в jq. Если вы знаете, что его там нет, я был бы признателен за любезное уведомление и некоторое предложение решить эту проблему.JQ: Функция FLATTEN типа PigLatin

Я обрабатываю общественность dataset. Мне удалось уменьшить данные в следующем формате строки:

[field1,field2,field3,[author1,...,authorN],[author_type1,...,author_typeN]] 

Команда Баш Я использую, чтобы добраться до этого формата заключается в следующем:

find aps-dataset-metadata_subdir_path/ -name '*.json' | \ 
xargs cat | \ 
jq --compact-output \ 
    'select(.authors != null) | [.identifiers.doi, .date, .journal.id, [.authors[].name], [.authors[].type]]' 

Обратите внимание, что authorN и author_typeN в тот же объект (т. е. имеющий один и тот же родительский элемент) в необработанных данных.

Я искал способ, чтобы произвести от каждого из них линия следующего:

[field1,field2,field3,author1,author_type1] 
[field1,field2,field3,author2,author_type2] 
... 
... 
[field1,field2,field3,authorN,author_typeN] 

Функция сплющивается в jq, кажется, уровень уплощения без создания новых списков. Если кто-то из вас знает PigLatin, я хочу, чтобы именно оператор PigLatin built-in Flatten.

Опять же, я знаю, что он не реализован в jq. В этом случае, вероятно, я выложу пост-обработку вывода в Python или любой другой потрясающий способ, который вы, ребята, предлагаете в ответах.

спасибо!

ответ

2

Вместо того, чтобы проходить через авторов отдельно в отдельных выражениях, вам нужно пройти через авторов один раз. Вы можете поместить результаты в переменную и получить доступ к ним позже.

select(.authors != null) | .authors[] as $author | 
    [ .identifiers.doi, .date, .journal.id, $author.name, $author.type ] 
2

предложение Джеффа использовать один шаг подход имеет смысл, но если один действительно должен был перевести массив [field1,field2,field3,[author1,...,authorN],[author_type1,...,author_typeN]] в поток массивов вида [field1,field2,field3,authorI,author_typeI] то подходящий JQ фильтр будет:

.[0:2] + ([.[3], .[4]] | transpose[])