Как напечатать элемент объекта для каждого внутреннего элемента массива в jq - PullRequest
1 голос
/ 23 января 2020

У меня есть JSON, который выглядит следующим образом:

test. json

[
  {
    "item1": {
      "item2": 123,
      "array1": [
        {
          "item3": 456,
          "item4": "teststring"
        },
        {
          "item3": 789,
          "item4": "teststring2"
        }
      ]
    }
  }
]

Я пытаюсь распечатать его в следующем формате :

123, 456, teststring
123, 789, teststring2

Я пытался сделать это так:

cat test.json | jq -r '.[].item1.item2, (.[].item1.array1[] | .item3, .item4)' | xargs printf "%s, %s, %s\n"

Но в результате выдается item2, за которыми следуют item3 и item4 в первом В следующей строке печатаются только item3 и item4, например:

123, 456, teststring
789, teststring2, 

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

Ответы [ 2 ]

2 голосов
/ 23 января 2020

Выполнение обработки вывода с помощью printf() оболочки * с xargs не требуется, поскольку вы можете выполнить обработку полностью в самом jq.

Вам нужно перебрать значения .item3 и .item4 каждый раз для одного уникального значения .item2. Чтобы получить результат в правильном формате CSV, отформатируйте массив, используя @csv, а для табличного представления вы можете использовать @tsv

jq -r '.[].item1 as $data | $data.array1[] | [ $data.item2 , .item3 , .item4 ] | @csv' json

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

Если вам все еще нужно потерять кавычки и представить их как необработанные строки, вы можете использовать join в формируемый массив

jq -r '.[].item1 as $data | $data.array1[] | [ ($data.item2|tostring) , (.item3|tostring) , .item4 ]|join(", ")'
1 голос
/ 23 января 2020

Это поможет

https://jqplay.org/s/KLPXwB7Ey_

.[].item1 as $item | $item.array1[] | $item.item2 , .item3 , .item4
...