2015-12-17 41 views
1

我一直在尋找一個相當具體的功能,可能不存在於jq。如果你知道它不在那裏,我將不勝感激,提供一些建議來解決這個問題。JQ:PigLatin風格FLATTEN功能

我正在處理一個公衆dataset。我已成功地將數據減少到以下行格式:

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

我使用的去使用此格式的bash命令如下:

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]]' 

注意,authorNauthor_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[])