У меня есть несколько больших файлов JSON, которые мне нужно переписать в один файл, но я могу сделать это только противным способом, который записывает много временных файлов. Давайте посмотрим на упрощенную версию моей проблемы, example.json
:
{
"a": {
"number": 1,
"word": "foo"
},
"b": {
"number": 2,
"word": "bar"
},
"c": {
"number": 3,
"word": "zebra"
}
}
Я хочу получить:
a,1,foo
b,2,bar
c,3,zebra
Мое решение:
jq 'keys | .[]' example.json | tr -d '"' > file1.csv
jq '.[] | .number' example.json > file2.csv
jq '.[] | .word' example.json | tr -d '"' > file3.csv
paste -d',' file1.csv file2.csv > file4.csv
paste -d',' file4.csv file3.csv > file5.csv
В приведенном выше коде я знаю, что мог бы упростить его, написав jq -r '.[] | [.number, .word] | @csv'
вместо jq '.[] | .word'
, избегая, таким образом, половины беспорядка, но давайте продолжим так, потому что мой вопрос связан с сантехнической частью.
Я пробовал много способов перенаправить вывод jq
в paste
, но у меня никогда не получалось:
paste <$(jq 'keys | .[]' example.json | tr -d '"') file2.csv
paste $(jq 'keys | .[]' example.json | tr -d '"') file2.csv
jq 'keys | .[]' example.json | tr -d '"') | paste file2.csv
Как поместить вывод jq
в paste
без необходимости создавать промежуточные файлы?