Печать всех ключей и значений в формате JSON в формате CSV - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть несколько больших файлов 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 без необходимости создавать промежуточные файлы?

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Зачем нужны paste и другие связки утилит оболочки, когда вы можете сделать все это в jq

jq -r 'to_entries[] | "\(.key),\(.value | .number),\(.value | .word)"' json
0 голосов
/ 05 сентября 2018

В Bash вы можете использовать процесс подстановки :

paste -d, <(jq ...) <(jq ...) <(jq ...)

Обратите внимание, что вставка принимает несколько файлов, а не только два.

...