Как преобразовать этот JSON в CSV?

Это смещение по модулю. Если RANDOMсоставлен правильно, каждое значение от 0 до 32767 создается с равной вероятностью. Когда вы используете модуль, вы изменяете вероятности :вероятности всех значений выше модуля добавляются к значениям, которым они соответствуют.

В вашем примере 6×3600 составляет примерно две трети диапазона значений. Таким образом, вероятности верхней трети складываются с вероятностями нижней трети, а это означает, что значения от 0 до 2 (приблизительно )будут получены в два раза чаще, чем значения от 3 до 5. 9×3600 — это почти 32767, поэтому смещение по модулю намного меньше и влияет только на значения от 32400 до 32767.

Чтобы ответить на ваш главный вопрос, по крайней мере в Bash случайная последовательность полностью предсказуема, если вы знаете начальное число. См. intrand32в variables.c.

1
23.08.2021, 04:14
1 ответ

Используйте выражение jq

.[].results[] |.[0] as $name |.[1:] | map([.[]]? // [.]) |
(.[0]|keys[]) as $i | [ $name,.[][$i] ] | @csv

Первая строка здесь выбирает $nameв качестве первого элемента(.[0])из каждого отдельного подмассива -(abc025и xyz025соответственно в отдельных итерациях ), а затем преобразует оставшиеся данные в каждом sub -массив(.[1:])в массивы по одному массиву на столбец:

[["true"],["test.lun"]]
[["true","false","true"],["product.lun","app.lun","ora.lun"]]

Это делается в вызове map(), где каждый элемент извлекается как массив. Если это не работает, элемент помещается в массив. Таким образом, каждый элемент либо остается массивом, либо преобразуется в массив из одного элемента.

Вторая строка перебирает индексы этих массивов столбцов и создает выходные данные в формате CSV.

Тестирование:

$ jq -r '.[].results[] |.[0] as $name |.[1:] | map([.[]]? // [.]) | (.[0]|keys[]) as $i | [ $name,.[][$i] ] | @csv' file
"abc025","true","test.lun"
"xyz025","true","product.lun"
"xyz025","false","app.lun"
"xyz025","true","ora.lun"

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

Вы также можете использовать это для данных, содержащих более трех столбцов. Документ

[
  {
    "results": [
      [ "abc025",
        "true",
        "test.lun",
        "blueberry" ],
      [ "xyz025",
        ["true","false","true"],
        ["product.lun","app.lun","ora.lun"],
        ["strawberry","cloudberry","lingonberry"] ]
    ]
  }
]

превратится в

"abc025","true","test.lun","blueberry"
"xyz025","true","product.lun","strawberry"
"xyz025","false","app.lun","cloudberry"
"xyz025","true","ora.lun","lingonberry"
2
23.08.2021, 06:45

Теги

Похожие вопросы